如何规范用户、引用和标签之间的(数据库)关系?

Posted

技术标签:

【中文标题】如何规范用户、引用和标签之间的(数据库)关系?【英文标题】:How to Normalize (database) relationship between User, Quotes, and Tags? 【发布时间】:2015-09-22 03:38:24 【问题描述】:

我正在开发一个显示引号的应用程序,就像 android 中的 BrilliantQuotes。我正在研究表格设计,但我无法就表格用户、引用和标签应该如何关联/设计/规范化提出解决方案。 这种关系类似于:

    一个用户可以有 0 个或多个标签。 一个标签可以有 0 个或多个引用,一个引用可以有 0 个或多个标签。

第一部分相当简单,我将在标签表上设置一个外键列来识别用户。对于第二部分,我如何表示这种关系?我不能只在标签表中添加一个引号 FK,反之亦然,因为那样它就不会被规范化,不是吗?此外,由于我将允许用户创建自己的标签,因此我可以有许多行具有相同的 TagName,例如“Funny”,我认为这是必要的,因为标签将是用户特定的,或者有更好的方法吗?

【问题讨论】:

像数学一样思考:4*3 = 12 和 3*4 = 12....所以 #2 确实是一回事:引用可以有零个或多个标签。时期。您将能够查询每个引号的标签或每个标签的引号。 @Stan - 但这会使事情的可扩展性不那么好,不是吗?让我们以这句名言“永不放弃”为例。带有“励志”“励志”“酷”“真棒”之类的标签,现在如果我在报价表上有一个标签的 FK,我将重复相同的报价,只有行之间的区别是标签。想象一下这对于几个用户来说,因为标签将被绑定到一个用户。如果我在标签表中为引号使用 FK,那将是类似的事情。这些应用真的是这样处理的吗? 【参考方案1】:

你要找的是交集表

定义非常稀疏,例如

CREATE TABLE dbo.Users ( id int identity, username varchar(99))
CREATE TABLE dbo.Tags  ( TagID INT Identity, taglabel varchar(99), ownerid INT)
CREATE TABLE dbo.Quotes ( QuoteID INT Identity, quoteText varchar(max))

然后

 CREATE TABLE QuoteTagMap (QTID INT identity, QuoteID INT, TagID int)

您可以向 QuoteTagMap 添加行来存储标签和引号之间的关系。如果你想让不同的用户对同一个报价有不同的标签......那么地图也会有一个 OwnerID

【讨论】:

解决方案的两个注意事项: a) 不要忘记添加外键约束; b)QuoteTagMap中的QTID没有添加任何信息,应该去掉,表的主键应该是其他属性的组合。 是的,我忽略了 FK。但我不同意QTID - 这个PK 使删除标签的UI 逻辑更容易。我会将 QuoteID、TagID 定义为集群 AK 索引并使用 QTID 进行更新。 在我看来,减少记录大小的好处是,每页有更多的记录,减少页数,从而加快记录的检索,比有一个字段更大简化 UI 逻辑,但我知道您可以有与我不同的体验。 这是解决方案的一半。 OP 描述了用户和标签之间的 m-n 关系以及引号和标签之间的独立 m-n 关系。这需要用户和标签之间以及引用和标签之间的交集。 我觉得没有足够的细节来处理用户/标签映射,并希望了解交集表的概念。用户/标签映射需要处理基本问题:我们是否有完全独立的标签(具有唯一 ID),碰巧有标签“有趣”,或者是否存在全球标签...以便多个用户存储他们的关系带有全球有趣的标签?当 想要一个新的 Hilarious 标签时,是添加到全局集还是只是我的个人集?就像我说的,问题...

以上是关于如何规范用户、引用和标签之间的(数据库)关系?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 数据库模型自身之间的关系

Spring Boot制作个人博客-框架搭建(设计与规范,实体类构建)

数据库关系直接与外键的间接引用

如何在 oracle SQL 开发人员的对象关系数据库功能中定义表之间的对象引用

02_用户模型设计

遵守道德规范和个人品德养成之间是啥关系