数据库多个可能的外键

时间:2018-03-15 19:43:33

标签: sql database

这是我的用户表。

enter image description here

用户可以是普通用户,也可以是作者。除了作者发表/发布故事这一事实之外,没有什么区别。

对于访问/权限级别也没有区别,因为普通用户可以通过个人资料访问故事,并且作者可以通过个人资料和仪表板访问故事。仪表板可以从用户配置文件中访问,并在发布的故事中列为操作。(标题 - 链接到故事配置文件,操作1仪表板 - 链接到故事仪表板,操作2删除)

到目前为止一切顺利。

我现在遇到的问题是,我必须添加审核和通知系统。

用户可以查看故事和作者。只要用户发布了至少1个故事,他就被视为作者。

用户接收来自书签故事更新的通知(新章节,故事的任何更改(编辑))。

如果用户是作者,如果其他用户审阅/评定了他/她的故事和他/她的个人资料,则用户可以收到通知。

我遇到了尝试各种方法来应用上述功能(我成功应用它们但数据库设计非常糟糕 - 我也没有对我的数据库强制执行任何外键约束。)

我很困惑如何识别评论是针对故事还是作者。

enter image description here

如果评论是针对作者的,我如何从同一个表中引用user_id的两个外键?(1是作者,另一个是审阅作者的用户)。 - 写到这里,我认为不可避免的我应该将用户表分成两个正常和作者。但是对于作者和普通用户,users表仍然是相同的。

如果评论是针对某个故事的,那么我是否会将一个story_id列添加到评论表中,如果评论是针对作者的,则将其保留为空,反之亦然?

所以我有author_id(fk)和story_id(fk),如果另一个有值,则必须为null。(以区分故事或作者评论)。

我也忘了添加,另一个名为user_profile的表有一个外键(来自用户表的user_id)。

1 个答案:

答案 0 :(得分:0)

根据现实世界的事物想想你的桌子,设计将是我体验中的大部分方式。您有用户可以访问您的网站,因此您需要一个Users表。你有作者,他们可以写内容,所以你需要一个作者表。您的所有作者都是 用户,因此您需要在那里建立关系。在安全性方面,您不要希望让您的用户分布在多个表中(即,不重叠的不同的Authors和Users表)。这将是一个维持的噩梦。用户写了一些内容,如果你走这条路,你现在突然需要将所有数据移到Authors表中。

现在,对于您的下一期,是对作者的评论和对同一本书的评论?不,它们是两个不同的东西,所以创建两个表 - 每个表一个。

Users
-----
user_id
username
password
...

Authors
-------
user_id
...

AuthorReviews
-------------
user_id (FK to Users table for the user who made the review)
author_id (FK to Authors table for the author that the review is about)
rating
summary
date_added

BookReviews
-----------
user_id (FK to Users table for the user who made the review)
book_id (FK to a Books table)
rating
summary
date_added

对于AuthorReviewsBookReviews表,主键只是user_id/author_iduser_id/book_id上的复合PK,假设用户只能查看一次。

user_id可能是自动增量ID或您提出的其他ID,但author_id会在创建作者行时来自Users表。这两张桌子都是PK。请注意,这只适用于作者 MUST 也是用户的情况。如果您的作者不是用户,那么您需要调整模型,以便生成author_id,然后UsersAuthors之间存在关联表在需要时建立关系。

至少这是我从事情开始的地方。

顺便说一句,你可以轻松地将多个外键放到同一个表中。只需在子表中为列提供不同的名称,但它们会链接回父级中的同一列。