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'))
)