Database design 如何为RDBMS中的多个表实现标记系统?

Database design 如何为RDBMS中的多个表实现标记系统?,database-design,rdbms,Database Design,Rdbms,假设您有一个任意数量的表,您希望允许用户将标记附加到该表上。例如,Stackoverflow允许我们标记一个问题,但也可能允许我们标记答案、作业、用户配置文件等 实施该计划的最佳方式是什么?做出该决定需要哪些信息 在每个要标记的表和标记表之间创建一个M:N 使用类表继承 在这种方法中,我们制作了一个taggable表,每个要标记的表都有一个FK返回到taggable,并且与taggable是1:1。tag表中有一个M:N,带有“taggable”

假设您有一个任意数量的表,您希望允许用户将
标记附加到该表上。例如,Stackoverflow允许我们标记一个问题,但也可能允许我们标记答案、作业、用户配置文件等

实施该计划的最佳方式是什么?做出该决定需要哪些信息

在每个要标记的表和
标记
表之间创建一个M:N 使用类表继承 在这种方法中,我们制作了一个
taggable
表,每个要标记的表都有一个FK返回到
taggable
,并且与
taggable
1:1
tag
表中有一个
M:N
,带有“taggable”

                            +-------foo
                            |
tag----<tag_taggable>----taggable
                            |
                            +-------bar
以下是为
taggable
创建的表:

CREATE TABLE taggable (
    id INTEGER PRIMARY KEY,
    type VARCHAR NOT NULL CHECK (type IN ('foo', 'bar'))
)

我同意第一种选择。第二个选项将强制您使用同一列作为所有可标记表的主键,并强制您为插入到foo或bar中的每条记录向可标记表插入一条记录。这将使insert更加麻烦,并且与多对多表相比没有任何实际好处。当然,系统中的表更少,但每个记录都需要更多的工作

当您需要存储具有不同属性的多个项目,但所有项目都共享一些公共属性时,1:1关系非常有用。 例如,与猫、狗、狮子和斑马有关的动物


它在标记系统中不太有用,因为所有可标记实体的唯一共同点是它们都是可标记的。

您是否计划将“类型”作为可标记对象ID的一部分?或者显式地:即,所有FOO对象都将有一个唯一的id,如“F-0101112”、“F-0449303”或(yikes!),隐式地使用范围,例如?@p.marino通常,当我执行非重叠类表继承时,
标记的
中的
类型
列将有
检查约束
键入('FOO','bar'
foo
/
条形“tables”ID是一个主键,是返回到
taggable
的FK。我已将创建表添加到问题的底部。
                            +-------foo
                            |
tag----<tag_taggable>----taggable
                            |
                            +-------bar
SELECT foo.*
FROM tag JOIN tag_taggable ON (tag.id = tag_taggable.id)
         JOIN taggable ON (tag_taggable.taggable_id = taggable.id)
         JOIN foo ON (taggable.id = foo.id)
WHERE tag = 'rdbms';
CREATE TABLE taggable (
    id INTEGER PRIMARY KEY,
    type VARCHAR NOT NULL CHECK (type IN ('foo', 'bar'))
)