这种DB关系设计是否有利和正确?它应该转换为无sql解决方案吗?

时间:2012-05-23 13:08:35

标签: nosql rdbms

首先,我做了我的研究,但我是一个新手,我不是很熟悉的话,所以可能没有找到正确的。如果可能重复,请原谅。

问题#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数据库?

谢谢。

2 个答案:

答案 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解决方案。