当您不确定哪些表将相关时,如何设计数据库关系?

时间:2016-02-19 21:10:53

标签: database-design

我们说我有一个Post表,实体可以发表评论。我可以在实体和实体之间做一个简单的1对多。邮政表。但是,我也可以拥有不属于实体帖子的用户......以及匿名用户帖子。要引导,用户和实体具有不同数据类型的PK。

我可以创建一个Post表并使用两个单独的字段来保存不同的FK,但明天我需要添加另一个可以发布的东西时会发生什么?这不会影响实体框架如何与数据库一起工作吗?

2 个答案:

答案 0 :(得分:0)

好的,你有一个Post表。

Post
----
Post ID
Post Text
Post Time Stamp
User ID
...

其中Post ID是自动递增long和Post表的主键。用户ID是返回User表的外键,如果是匿名帖子,则为null。

User
----
User ID
User Name
User Password
...
  

但是,我也可以拥有不属于实体帖子的用户。

您必须以更详细的方式,方式和方式来描述这一点。

答案 1 :(得分:0)

查询不需要外键(“关系”)。他们是为了诚信。它们告诉DBMS,表的列列表的值列表必须显示为在表中形成候选键的不同列列表的值列表。 SQL外键只需引用形成UNIQUE列集(“超级键”)的列。 PRIMARY KEYs只是一个特例。

如果您想告诉DBMS帖子的作者必须来自几个不相交的表,那么在大多数SQL中都没有声明性的方式。但是,您可以以不同方式组织表和列,以便可以声明性地强制执行:

使用带有UNIQUE(poster_id,poster_type)的poster_id PK和poster_type列创建一个表格Poster。然后将这些列的各种海报表作为FOREIGN KEY引用海报。 poster的每个子类型(实体,用户,匿名)都有自己的poster_type值,在整个表中都是相同的。海报检查poster_type是有效的子类型值之一;每个子类型表CHECK它的poster_type是它自己的值。

对于其他一些方法,请参阅this answer“多个表的外键”。或this answer。 Google在SQL中进行子类型化。