首先,我做了我的研究,但我是一个新手,我不是很熟悉的话,所以可能没有找到正确的。如果可能重复,请原谅。
问题#1:
我有一张由ID [PK] and LABEL [Varchar 128]
组成的表格。这里的每条记录(行)都是唯一的。我想要的是,定义这些LABELS之间的关系。
必要的:
将有 n 数量的组,每个组包含一个或多个这些LABELS。在每个组中,每个LABEL可以存在或不存在(意味着一个组没有2x相同的LABEL)。
我该如何定义这种关系?
我想过用ID [PK] - Group ID [randomly assigned unique key] - LABEL_ID [ID of Labels table pointing to a single Label]
这是正确和有利的吗?如果一个组有10个LABELS,那么将有10个具有唯一ID的记录,同样唯一分配Group ID and LABEL_ID
指向LABELS表。
问题#2:
我应该放开Relational解决方案(如上所述)并选择NoSQL解决方案吗?其中每个组都作为单个条目存储在它自己的{{1 }}
如果NoSQL是要走的路,我应该如何存储这些数据?
a)我应该有ID - 数据(包含标签)吗? b)ID - 数据(包含标签的ID)?
问题#3:
如果这里的NoSQL解决方案是最好的方法,我应该为这个用例选择哪个NoSQL数据库?
谢谢。
答案 0 :(得分:1)
这里提供的信息太少,无法就“SQL还是SQL”这个问题提出建议。
但是,我认为关系方法就像你描述的那样。
CREATE TABLE Group
(
GroupId int PRIMARY KEY
)
CREATE TABLE GroupLabel
(
GroupId int FOREIGN KEY REFERENCES Group,
LabelId int FOREIGN KEY REFERENCES Label,
UNIQUE (GroupId, LabelId)
)
CREATE TABLE Label
(
LabelId int PRIMARY KEY,
Value varchar(100) UNIQUE
)
此处,每个标签都是唯一的,每个组中可能有许多标签,每个标签可能在多个组中,但每个标签只能在每个组中一次。
如@Damien_The_Unbeliever所示,如果您不需要通过Group
表上的GroupId
列来存储关于每个组的任何其他属性,则可以省略GroupLabels
表唯一的。
对于您正在使用的任何RDBMS,您可能需要稍微更改语法。
答案 1 :(得分:1)
此ID
表格中不需要GroupLabels
列:
CREATE TABLE GroupLabels (
GroupID int not null,
LabelID int not null,
constraint PK_GroupLabels PRIMARY KEY (GroupID,LabelID),
constraint FK_GroupLabels_Groups FOREIGN KEY (GroupID) references Groups,
constraint FK_GroupLabels_Labels FOREIGN KEY (LabelID) references Labels
)
通过以上操作,我们自动实现了一个约束 - 同一个标签不能多次添加到同一个组中。
有了上述内容,我会说这是一个相当常见的SQL解决方案。