gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:23:19 25 4
gpt4 key购买 nike

假设您有一个任意数字表,您希望允许用户将 标签 附加到这些表。例如,Stackoverflow 让我们可以标记一个问题,但也许它也可以让我们标记一个答案、一份工作、我们的用户个人资料等。

实现它的最佳方式是什么?做出此决定需要哪些信息?

在要标记的每个表和 tag 表之间创建一个 M:N

 +----<tag_foo>----foo
|
tag
|
+----<tag_bar>----bar

找到所有带有标签 = 'rdbms' 的 Foos

SELECT foo.*
FROM tag JOIN tag_foo ON (tag.id = tag_foo.tag_id)
JOIN foo ON (tag_foo.foo_id = foo.id)
WHERE tag.name = 'rdbms';

使用类表继承

在这个方法中,我们做了一个taggable表,每个要tag的表都有一个FK返回taggable并且是1:1使用可标记tag 表有一个带有 `taggable.

M:N
                            +-------foo
|
tag----<tag_taggable>----taggable
|
+-------bar

找到所有带有标签 = 'rbdms' 的 Foos

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

这是为 taggable 创建的表:

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

最佳答案

我会选择第一个选项。第二个选项将强制您使用同一列作为所有可标记表的主键,并将强制您为插入 foo 或 bar 的每条记录向可标记表插入一条记录。这将使插入更加麻烦,并且对多对多表没有真正的好处。当然,系统中的表更少,但每条记录的工作量更大。

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

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

关于database-design - 如何为 RDBMS 中的多个表实现标记系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37983710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com