【发布时间】:2010-12-29 18:54:11
【问题描述】:
在我的 Rails 应用程序中,我有各种包含用户数据的数据库表。其中一些表有很多行(在某些情况下,每个用户多达 500,000 行)并且经常被查询。每当我查询任何表的任何内容时,当前用户的 user_id 都在查询中的某个位置 - 如果表与用户有直接关系,则直接,如果它们通过其他表相关,则通过连接。
我是否应该对 user_id 进行非规范化并将其包含在每个表中,以获得更快的性能?
这是一个例子:
- 地址属于用户,并且有一个user_id
- 信封属于用户,并且有一个user_id
- AddressesEnvelopes 连接了地址和信封,因此它具有信封_id 和地址_id - 它没有用户id,但可以通过信封或地址(必须属于同一用户)来获取它。李>
一个常见的昂贵查询是为特定用户选择所有 AddressesEnvelopes,我可以通过加入 Address 或 Envelope 来完成,即使我不需要这些表中的任何内容。或者我可以在此表中复制用户 ID。
这是一个不同的场景:
- 字母属于用户,并且有一个 user_id
- 收件人属于 Letter,并且有一个 letter_id
- RecepientOption 属于 Recepient,并且有一个 recepient_id
在 Recepient 和 RecepientOption 中复制 user_id 是否有意义,即使我总是可以通过关联、通过 Letter 来获得它?
一些注意事项:
- 从来没有任何对象是 用户之间共享。一个完整的 相关对象的层次结构总是 属于同一用户。
- 对象的用户所有者永远不会改变。
- 数据库性能很重要,因为它是一个数据密集型应用程序。有很多查询和很多表。
那么我应该在每个表中包含 user_id 以便在创建索引时使用它吗?或者那会是糟糕的设计?
【问题讨论】:
标签: ruby-on-rails database-design normalization denormalization