Database design 我应该总是围绕外键进行设计吗?

Database design 我应该总是围绕外键进行设计吗?,database-design,Database Design,例如,我有一个标记查找表,将标记连接到3种不同类型的表(ObjectType)。每个都有标记,但它们不是共享的 所以我可以这样做 Tagid | ObjectType | ObjectId| 当我将表连接在一起时,我只会在连接之前按对象类型进行过滤 现在我知道这将破坏对ObjectId列执行外键的能力,因为它可以是三个表中的任意一个 问题是。。这是一件可怕的事情吗?如果是,为什么 另一个选项是为每个对象创建查找表,除非有更好的方法 不要考虑外键,要考虑是否要在数据库级别强制执行引用完整性。如果没

例如,我有一个标记查找表,将标记连接到3种不同类型的表(ObjectType)。每个都有标记,但它们不是共享的

所以我可以这样做

Tagid | ObjectType | ObjectId|

当我将表连接在一起时,我只会在连接之前按对象类型进行过滤

现在我知道这将破坏对ObjectId列执行外键的能力,因为它可以是三个表中的任意一个

问题是。。这是一件可怕的事情吗?如果是,为什么


另一个选项是为每个对象创建查找表,除非有更好的方法

不要考虑外键,要考虑是否要在数据库级别强制执行引用完整性。如果没有RDBMS强制的引用完整性,您将不得不自己在应用程序中强制执行它,或者不遗余力地编写复杂的数据库约束,以完成RDBMS已经以外键形式提供给您的任务


但实际上,您没有任何理由将三个概念表存储在一个大表中。在同一个表中存储多个表的数据不是一个好主意,因为它们具有相同的列。它们具有相同的模式,但它们不是相同的表。

不要考虑外键,要考虑是否要在数据库级别强制执行引用完整性。如果没有RDBMS强制的引用完整性,您将不得不自己在应用程序中强制执行它,或者不遗余力地编写复杂的数据库约束,以完成RDBMS已经以外键形式提供给您的任务


但实际上,您没有任何理由将三个概念表存储在一个大表中。在同一个表中存储多个表的数据不是一个好主意,因为它们具有相同的列。它们有相同的模式,但它们不是相同的表。

这可能是为未来设计的一个案例,而我不应该这样做。添加其他对象表会减少设计工作,但从长远来看,这可能会使事情变得更糟。这可能是为将来设计的一种情况,而我不应该这样做。添加其他对象表会减少设计工作,但从长远来看,这可能会使事情变得更糟。