嵌套表层次结构:外键复制与连接

she*_*ron 6 mysql performance foreign-key hierarchy duplication

我有一个嵌套表层次结构,类似于以下一个(这是一个示例,但足以很好地演示模式):

+---------+  +---------+  +---------+  +-------------+
| users   |  | blogs   |  | posts   |  | comments    |
+---------+  +---------+  +---------+  +-------------+
| user_id |  | blog_id |  | post_id |  | comment_id  |
| email   |  | user_id |  | blog_id |  | post_id     |
+---------+  | name    |  | content |  | comment     |
             +---------+  +---------+  +-------------+
Run Code Online (Sandbox Code Playgroud)

因此,对象层次结构很明确:评论属于单个帖子,属于单个博客,属于单个用户。

现在,在我的应用程序代码中,我想验证评论只能由拥有帖子的博客的用户阅读(假设这些是私人评论,好吗?)。例如,当 I 时SELECT * FROM comments WHERE comment_id = 666,我想验证请求用户“拥有”该评论。

我的困境是:你会建议我:

  • 复制user_idto comments,所以我总是可以快速参考拥有的用户,并且检查用户 ID(在选择期间或之后)很简单,或者
  • 编写我的数据库访问代码(映射器或您拥有的任何东西)以始终 JOIN 并获取 user_id 字段作为返回对象的一部分。请注意,在这种情况下,我需要两个 JOIN 才能做到这一点

基本上我认为它是性能与所谓的数据复制不良做法 - 但在这种情况下真的是一种不良做法吗?user_id值不太可能改变或 ablog改变其user_id.

如果这有什么不同,我正在使用 MySQL(实际上是 MariaDB)。

Ash*_*han 1

显然,出于多种原因,您应该选择第二个选项:

  • 如果您需要提出同一评论级别的实体,您会再次添加用户 ID 吗?也许它不会发生在你的场景中,但仍然会发生。

  • 存储,随着数据库大小的增长

  • 不会对性能产生太大影响,因为您的查询是高度选择性的并且如果您有良好的索引设计。