【问题标题】:How do you design a database relationship when you are not sure which tables will be related?当您不确定哪些表将相关时,您如何设计数据库关系?
【发布时间】:2016-02-24 12:01:00
【问题描述】:

假设我有一个 Post 表,一个实体可以在其中发布 cmets。我可以在实体和发布表之间做一个简单的一对多。但是,我也可以让不属于实体帖子的用户......以及匿名用户发布。启动时,用户和实体具有不同数据类型的 PK。

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

【问题讨论】:

  • 发布一些示例代码或数据库布局
  • 您使用的是什么 DBMS?能力不同。
  • “将相关”这个短语是模棱两可的,尽管起初看起来可能不是这样。如果这些关系是主题所固有的,那么它们就是相关的,无论你是否知道。如果您的意思是将关系用于加入目的,那么这取决于您将如何使用数据。

标签: database-design


【解决方案1】:

好的,你有一个 Post 表。

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

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

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

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

您将不得不以更详细的方式描述这一点。

【讨论】:

    【解决方案2】:

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

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

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

    有关其他一些方法,请参阅this answer re“多个表的外键”。或this answer。 SQL 中的 Google 子类型化。

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 2010-09-17
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2010-09-21
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多