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