问题标签 [schema-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
364 浏览

mysql - 这两种 MySQL DB Schema 方法中的哪一种对检索和排序最有效?

对于以下情况我应该采用两种数据库模式方法中的哪一种,我感到困惑。

我需要为一个网站存储多个属性,例如页面大小、字数、类别等,以及将来可能增加的属性数量。目的是向用户显示此表,他应该能够在数据中快速过滤/排序(因此表结构应该支持快速查询和排序)。我还想保留以前的数据日志以维护更改的时间表。所以我想到的两个表结构选项是:

选项 A

网站属性

id,website_id,page_size,word_count,category_id,title_id,......(最多18列,必须记住可能有一些空值,将来可能还需要添加更多列)

website_attributes_change_log

与上面相同的表结构,添加了“change_update_time”列

我觉得这种模式的优点是即使某些属性链接到其他表并且排序也很简单,查询也很容易编写。我猜想稍后添加列的缺点可能是 ALTER TABLE 需要很长时间才能在大型数据表上运行 + 可能有很多行有很多空列。

选项 B

网站属性字段

attribute_id、attribute_name(例如 page_size)、attribute_value_type(例如 int)

网站属性

id、website_id、attribute_id、attribute_value、last_update_time

这里的优势似乎是这种方法的灵活性,因为我可以随时添加列,还可以节省存储空间。但是,尽管我很想采用这种方法,但我觉得在需要显示表格时编写查询会特别复杂[因为我需要一次显示多个站点的记录,并且还会有交叉引用某些属性的其他表的值] + 对数据进行排序可能很困难[鉴于这不是基于列的方法]。

我要查看的示例输出是:

Site-A.com,232032 字节,232 字,PR 4,房地产 [链接到类别表],..

Site-B.com, ..., ..., ... ,...

并且用户需要能够按所有基于数字的列进行排序,在这种情况下,方法 B 可能会很困难。

因此,我想知道我是否会通过选择 A 来做正确的事情,或者是否还有其他更好的选择,我什至可能一开始都没有考虑过。

0 投票
4 回答
12930 浏览

node.js - Mongoose 变量键名

我有一个mongo对象并希望通过mongoose我的网络应用程序访问它。我定义的模式有一个Object存储用户 ID 和一个 3 级值(是、可能或否)。

例如

上面的id_value_*s 是用户会话 ID,因此是一长串随机字符。我怎样才能mongoose Schema为此创建一个?

  1. user_info: {String, String}工作吗?

  2. 我可以对其进行重组,使其成为user_info一个对象数组{ "sessionid": "<value>", "value: "y"},这没关系,这是最好的选择吗?

0 投票
3 回答
34174 浏览

node.js - 在 mongodb 上每个集合使用多个模式

我想在 mongodb 中为每个集合使用多个模式,如何使用它....?
当我尝试运行它时,它给了我这个错误:

错误:

allUsersOverwriteModelError:编译后 无法覆盖模型。OverwriteModelError:编译后
无法覆盖模型。checkInOut


这是我的 schema.js

0 投票
1 回答
1462 浏览

ruby-on-rails - 使用 Mongoid 的 MongoDB 对话/私人消息模式

我正在 Rails 中构建一个论坛系统,以便更加熟悉 Rails 和 Mongoid。我想添加的一个功能是一个私人消息系统论坛用户可以用来互相发送消息。在架构设计方面,我可以想到两种解决方案:

解决方案 1

用户和消息是使用“has_many”和“belongs_to”相互链接的单独文档。

用户文件

has_many :messages_sent, :class_name => '消息', :inverse_of => :message_sender

has_many :messages_received, :class_name => 'Message', :inverse_of => :message_recipient

留言文件

字段:创建,类型:日期时间,默认值:-> { Time.now }

字段:内容,类型:字符串

belongs_to :message_sender, :class_name => '用户', :inverse_of => :messages_sent

belongs_to :message_recipient, :class_name => '用户', :inverse_of => :messages_received

为了向用户显示他的收件箱,我会查看some_user.messages_receivedordered by:created和filtered,因此我有一个唯一发件人ID 列表,按他们最后一条消息发送到的时间排序some_user

然后为了显示一个特定的对话,我只需获取两个参与者之间的所有消息并根据时间戳将它们交错:

messages_in = some_user.messages_received.where(:message_sender => selected_correspondent)

messages_out = some_user.messages_sent.where(:message_recipient => selected_correspondent)。

我不喜欢这个解决方案,因为它涉及多次使用“where”查询来访问 Messages 集合,以及对发送和接收的消息进行大量手动过滤和交错。努力。

解决方案2(我现在正在使用)

在对话文档中嵌入消息。我将在下面提供用户、消息和对话的代码。一个对话通过has_and_belongs_to_many(nn 因为一个用户也可能有许多对话) 链接到两个或多个用户。这也可能允许多用户对话。

我喜欢这个解决方案,因为为了向用户显示他的收件箱,我可以使用在对话文档中存储和更新的some_user.conversations排序方式:last_message_received,无需过滤。要显示特定对话,我不需要交错发送和接收的消息,因为消息已经以正确的顺序嵌入到对话文档中。

此解决方案的唯一问题是在您要添加消息时找到由两个(或更多)用户共享的正确对话文档。这里建议了一种解决方案:mongodb conversation system,但我不喜欢它,因为查询似乎相对昂贵,并且多用户对话的扩展看起来会很棘手。相反,我在对话文档中有一个名为的字段,:lookup_hash它是根据参与对话的每个用户的对象 ID 计算的 SHA1 哈希。这样,给定两个或更多用户,找到他们对应的对话文档(或者如果它还不存在,则创建它)是微不足道的。

要将消息添加到对话中,我只是使用Conversation.add_message(类方法,而不是实例方法,因为对话可能还不存在)给它一个发送者、接收者和新的消息对象。

问题

我的问题是:考虑到 Mongoid(或者一般来说只是 NoSQL)架构设计的最佳实践,我是否做任何明显错误的事情?我能做些什么来改进我的解决方案吗?我使用哈希查找对话的想法是个坏主意吗?

代码

用户.rb

对话.rb

消息.rb

0 投票
1 回答
2128 浏览

biztalk - BizTalk Schema 开发 - 十六进制值 0x19,是无效字符

我有一个架构元素节点,如下所示

<MESSAGE>Employees eligibility for a benefit granted by a banking department agency of security.</MESSAGE>

在为此节点开发架构时,我发现警告为

警告 BEC2004:'',十六进制值 0x19,是无效字符。第 20 行,第 26 位。

请问有人可以帮我吗?

0 投票
1 回答
624 浏览

biztalk - 元素出现的 BizTalk 架构开发问题

请找到以下 XML 格式,我正在尝试为其构建架构。

如果您看到 chich 记录 -> ANNUALCOMPCOLLECTION -> ANNUALCOMP -> COMMISSION & BONUS元素,则始终不重复。

由于这个原因,我的模式验证实例抛出如下警告

错误 BEC2004:元素“ANNUALCOMP”具有无效的子元素“OTHER”。预期的可能元素列表:'OVERTIME,COMMISSION'。

错误 BEC2004:元素“ANNUALCOMP”具有无效的子元素“OTHER”。预期的可能元素列表:'OVERTIME,COMMISSION'。

我必须设置什么样的属性才能正确实现此验证?

0 投票
0 回答
137 浏览

python - 用于跟踪转换和记录过程的 MongoDB Schema

我正在使用更灵活的 MongoDB 重新设计一个非常规范化的数据库。当前的问题是现有结构不支持在不广泛更改 MySQL 模式的情况下实施的新流程。与其修改现有系统,MongoDB 的理念似乎对业务的未来更具颗粒感。

业务规则如下:

必须跟踪原材料。将根据分析制作有关此原材料的日志。原材料将被加工并转化为组件。必须保留有关此多步骤转换的日志。一个组件将被加工成一个零件。必须保留有关此过程的日志。零件可以在装配体中使用。零件或组件可以运送给客户。此外,不同的材料完成转化的过程系统也不同。此外,它需要是动态的,以防发现优化的过程。

收藏品和文件:

  • 系统 - 一组进程
  • 流程 - 系统的子文档,每个系统将有许多流程
  • 日志 - 带有时间戳的信息日志,其中包括机器或操作员记录的数据和事实。日志将具有不同的类型,具体取决于它们适用的过程。每个日志条目将链接回上述进程和组件之一。
  • 原材料 - 跟踪原材料中的项目
  • 组件 - 跟踪已从原材料转换为组件的项目
  • 零件 - 跟踪从组件或原材料转换而来的物品

我的问题是关于父母和孙子对象之间的关系。我是否应该将它们包含在与子文档相同的文档中,IE(孙子代表部分):

我预计会有大量的孙子孙女,最好的处理方法是什么?

0 投票
1 回答
96 浏览

sql - 关系模型中OneToMany关系表现的一般设计原则

我注意到一个现在看起来很明显的模式。需要征求您对此的意见。

假设在关系模型中有从表 1 到表 2 的一对多关系。例如,表 1 可以是用户表,表 2 可以是记录所有用户登录的登录表。一个用户可以多次登录。给定一个用户,我们可以找到该用户的所有登录信息。

想到的第一个想法是将登录名仅存储在登录表中。这是设计一。

但是,如果对于某些用例,我们对用户的特定登录感兴趣(比如最后一次登录),那么在用户表本身中缓存最后一次登录时间“通常是一个好主意”。那正确吗?

设计 2 显然是多余的,因为我们总是可以通过执行连接然后丢弃除先前登录之外的所有内容来找到上次登录时间。

对于一个用户来说,两者都应该没问题。但是,如果您想通过 SQL 查询查找所有用户的上次登录时间,那么设计 1 将涉及连接和子查询以过滤掉不需要的结果。

但是考虑到我们的用例,最好将上次登录时间存储在用户表本身中,这将使我们免于加入。那正确吗?

这是您在设计模式时看到的通用模式吗?

0 投票
1 回答
2382 浏览

mongodb - MongoDB Schema Design(嵌套数组 vs 单独集合)

我正在编写客户端管理 Web 应用程序。我正在尝试找出管理客户付款关系的正确方法。每天一次,应用程序向另一个 API 发送请求,并为我存储在数据库中的每个客户同步付款金额。我经常需要根据客户类型(合同类型、销售日期等)运行付款报告(付款金额)。我已经有clients收藏了。我试图在两种模式之间进行选择:

与创建单独的集合“ payments”相比,其中每个文档都是payment. 我觉得最好将这些数据分开,因为client每次查询都会将每个文档增长为大量数据(如果我选择特定字段,这仍然会占用大量内存)。但另一方面,我将无法运行聚合报告(因为它基于来自两个不同集合的数据)。最好的方法是什么?我应该将它们分开并在服务器端(php)上使用两个不同的查询进行聚合吗?

0 投票
1 回答
563 浏览

python - Cross-referencing foreign keys in Django 1.4

I have a Django project where I would need two models to have a foreign key to each other. However this is not possible because two Python files would have to import each other which Python doesn't allow. What is the best way to solve this problem?

So my code currently looks like this:

countries/models.py:

users/models.py:

Error given is: ImportError: cannot import name Profile