与一个表

时间:2015-07-13 15:08:00

标签: mysql database many-to-many junction-table

我的数据库有几个类别,我想附加用户创作的文本“notes”。例如,名为jobs的高级表中的条目可能有几个由用户写的关于它的注释,但sub_projects中的较低级别条目也可能。由于这些注释都是相同的格式,我想知道我是否可以通过只有一个注释表而不是像job_notesproject_notes这样的一系列表来简化事情,然后使用多个到多个关系,一次将它链接到其他几个表。

如果这不是一个严重缺陷的想法(让我知道它是不是!),我想知道最好的方法是什么。在我看来,我可以用两种方式做到:

  1. 为每个较大的类别设置多对多联结表,例如job_notes_mappingproject_notes_mapping,并单独管理MtM关系
  2. 将单个联结表链接到table_type的枚举或单独表,该表指定MtM关系映射到的表:

    +-------------+-------------+---------------+
    | note_id     | table_id    | table_type_id |
    +-------------+-------------+---------------+ 
    |           1 |           1 | jobs          |
    |           2 |           2 | jobs          |
    |           3 |           1 | project       |
    |           4 |           2 | subproject    |
    | ........... | ........... | ........      |
    +-------------+-------------+---------------+
    
  3. 请原谅我,如果其中任何一个都是完全可怕的想法,但我认为这至少在概念上可能是一个有趣的问题。

1 个答案:

答案 0 :(得分:1)

理想的方式,IMO,将拥有一个超类型的工作,项目和子项目 - 让我们称之为活动 - 您可以在其上定义任何常见的事实类型。

例如(我假设工作,项目和子项目形成一个包容层次结构):

activities (activity PK, activity_name, begin_date, ...)
jobs (job_activity PK/FK, ...)
projects (project_activity PK/FK, job_activity FK, ...)
subprojects (subproject_activity PK/FK, project_activity FK, ...)

不幸的是,大多数数据库模式定义了唯一的自动递增标识符PER TABLE,这使得在加载数据之后很难实现超类型化。 PostgreSQL允许重复使用序列,这很棒,其他一些DBMS(如MySQL)根本不会让它变得容易。

我的第二个选择是你的选项1,因为它允许定义外键约束。我根本不喜欢选项2。