我的数据库有几个类别,我想附加用户创作的文本“notes”。例如,名为jobs
的高级表中的条目可能有几个由用户写的关于它的注释,但sub_projects
中的较低级别条目也可能。由于这些注释都是相同的格式,我想知道我是否可以通过只有一个注释表而不是像job_notes
或project_notes
这样的一系列表来简化事情,然后使用多个到多个关系,一次将它链接到其他几个表。
如果这不是一个严重缺陷的想法(让我知道它是不是!),我想知道最好的方法是什么。在我看来,我可以用两种方式做到:
job_notes_mapping
和project_notes_mapping
,并单独管理MtM关系将单个联结表链接到table_type
的枚举或单独表,该表指定MtM关系映射到的表:
+-------------+-------------+---------------+
| note_id | table_id | table_type_id |
+-------------+-------------+---------------+
| 1 | 1 | jobs |
| 2 | 2 | jobs |
| 3 | 1 | project |
| 4 | 2 | subproject |
| ........... | ........... | ........ |
+-------------+-------------+---------------+
请原谅我,如果其中任何一个都是完全可怕的想法,但我认为这至少在概念上可能是一个有趣的问题。
答案 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。