Mysql 交集表或公共超级表

Mysql 交集表或公共超级表,mysql,database-design,intersection,anti-patterns,Mysql,Database Design,Intersection,Anti Patterns,我现在有一个这样的设计。每个对象类都有表。然后,每个表都包含需要与多个状态关联的行(对象) 状态表 身份证 地位 用户 身份证 用户名 其他一些对象类 身份证 将每个对象类表链接到状态表的最佳方式是什么?我在SQL反模式中描述的两种方法之间摇摆不定: 交叉表 用户\u具有\u状态 用户id 身份证 唯一(用户id、状态id) 等。这将需要每个对象类的交集表。因此,当我添加更多的对象类(表)时,我需要添加一个交集表,这意味着 祖先表 对象\u祖先 身份证 对象\u祖先\u状

我现在有一个这样的设计。每个对象类都有表。然后,每个表都包含需要与多个状态关联的行(对象)

状态表

  • 身份证
  • 地位
用户

  • 身份证
  • 用户名
其他一些对象类

  • 身份证

将每个对象类表链接到状态表的最佳方式是什么?我在SQL反模式中描述的两种方法之间摇摆不定:

交叉表 用户\u具有\u状态

  • 用户id
  • 身份证
  • 唯一(用户id、状态id)
等。这将需要每个对象类的交集表。因此,当我添加更多的对象类(表)时,我需要添加一个交集表,这意味着

祖先表 对象\u祖先

  • 身份证
对象\u祖先\u状态

  • 对象\u祖先\u id
  • 身份证
  • 唯一(对象\祖先\ id、状态\ id)
然后,每个对象类都会有一个带有外键的列,该外键链接到object_祖先表中的id列


就性能和设计优雅而言,哪种方式更好?

我的意见是交叉表方式更好。

如果您有许多状态实体的表,并且您使用一个表将它们链接到状态,那么随着您添加越来越多的数据,性能将越来越差(因为当DBMS查找实体的状态时,它必须“检查”所有其他类型实体的条目)。


祖先方式的另一个问题是,通过查看数据库结构,您无法判断哪些类型的实体具有状态。例如,如果你有人、狗和石头,它们在祖先表中都有条目,你就无法判断石头没有状态。

我真的不明白“对象可能多次具有相同的状态,这是一件坏事。”(在最后一段中)。如果我有状态:付费、活动、非活动。我可以有一个状态为付费和活动的用户。但是,如果使用祖先表,则不能具有唯一性(用户id、状态id)。这意味着,如果应用程序代码存在错误,我可以为给定用户获取多个“活动”条目。我理解为祖先表的是,用户不能同时付费和活动。我编辑了帖子并添加了一个额外的表。这解决了数据库将每个对象强制为每个状态只有一个副本的问题。但是,哪一种性能更好?使用交集表将在数据库中产生大量额外的表。@phpdev:它会产生更多的表,而不是额外的表。(它们不是额外的;它们是必需的。)根据粗略的经验,给定要存储的数据量为“x”,期望有更多的表来提高性能。(只要将表规范化为BCNF或5NF。)