交叉表或Common Super表

时间:2011-07-02 02:02:08

标签: mysql database-design intersection anti-patterns

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

状态表

  • ID
  • 状态

用户

  • ID
  • 用户名
  • ...

其他一些对象类

  • ID

  • ...

将每个对象类表链接到状态表的最佳方法是什么?我在SQL Antipatterns中描述的两种方法之间折腾:

交叉表

users_has_statuses

  • USER_ID
  • STATUS_ID
  • UNIQUE(user_id,status_id)

等。这将需要每个对象类的交集表。因此,当我添加更多对象类(表)时,我需要添加一个交集表,这意味着

祖先表

object_ancestor

  • ID

object_ancestor_statuses

  • object_ancestor_id
  • STATUS_ID
  • UNIQUE(object_ancestor_id,status_id)

然后,每个对象类都有一个列,其外键链接到object_ancestor表中的id列。

在性能和设计优雅方面,哪种方式更好?

1 个答案:

答案 0 :(得分:1)

我的观点是交叉表方式更好。

如果有许多具有状态的实体的表,并且您使用单个表将它们链接到状态,那么当您添加越来越多的数据时,性能将会逐渐降低(因为当DBMS查找实体的状态时,它将具有为所有其他类型的实体“通过”条目。

祖先方式的另一个问题是,通过查看数据库结构,您无法分辨哪些类型的实体具有状态。例如,如果你有人,狗和岩石,每个都有祖先表中的条目,你就不能说岩石没有状态。