Database design 如何将多个记录相互关联?

Database design 如何将多个记录相互关联?,database-design,Database Design,我有可以属于多个类别的食品,一个类别可以有很多 食品。类别具有层次性: 食品>有机食品 食品>加工 我试图在设计数据库模式时牢记这两个约束。我应该如何进行模式设计来支持这一点 作为另一个例子,我突然想到堆栈溢出有一个与此类似的系统。。。标签。每个问题都有多个标记,每个标记都有多个问题。这是如何实现的?如何根据分类需要调整此设计?这是一种多对多关系。一个问题可以有许多标签,标签可以有许多问题。在数据库中,这用一个附加表(标记id和问题id)表示。这是一种多对多关系。一个问题可以有许多标签,标签

我有可以属于多个类别的食品,一个类别可以有很多 食品。类别具有层次性:

  • 食品>有机食品
  • 食品>加工
我试图在设计数据库模式时牢记这两个约束。我应该如何进行模式设计来支持这一点


作为另一个例子,我突然想到堆栈溢出有一个与此类似的系统。。。标签。每个问题都有多个标记,每个标记都有多个问题。这是如何实现的?如何根据分类需要调整此设计?

这是一种
多对多关系。一个问题可以有许多标签,标签可以有许多问题。在数据库中,这用一个附加表(
标记id
问题id
)表示。

这是一种
多对多
关系。一个问题可以有许多标签,标签可以有许多问题。在数据库中,这是由一个附加表(
标记id
问题id
)表示的。

在大多数关系数据库系统中,多对多关系通常由两个包含有问题数据的数据库表以及一个链接它们的中间表组成。大概是这样的:

Posts
--------
ID
Title
Content

Tags
--------
ID
Title

PostTags
--------
PostID
TagID
Products
--------
ID
Name
Description

Categories
--------
ID
Title
ParentCategoryID

ProductCategories
--------
ProductID
CategoryID
这通过中间表在
Posts
标记之间创建了一种间接关系。(请注意,如果您确实需要,中间表也可以有一个
ID
列,但可能不需要它。请记住,向该表中添加更多列可能会带来创建非直观建模的风险。这通常不是什么大问题,但在对数据建模时需要注意。向中间表中添加更多列此表可以使数据模型之间的“关系”本身成为模型。)

对于食物类别,您添加了一个额外的复杂性层次,因为类别是分层的。然而,这可能只需要一个自引用列就可以实现。大概是这样的:

Posts
--------
ID
Title
Content

Tags
--------
ID
Title

PostTags
--------
PostID
TagID
Products
--------
ID
Name
Description

Categories
--------
ID
Title
ParentCategoryID

ProductCategories
--------
ProductID
CategoryID
这里的主要区别是
Categories
表现在有一列指向该表自己的
ID
。因此,在该表中有一个
Food
记录,该记录具有
ID
值,并且由于它是层次结构中的顶级,因此
ParentCategoryID的
null
值。然后,
Organic
记录将有自己的
ID
值,并在其
ParentCategoryID
字段中使用
Food
记录的
ID
值。这将创建层次结构,而不会给数据模型增加不必要的复杂性


请注意,这种设计本身并不能阻止某人,比如说,将某物同时归类为
食品
有机
。如果不希望发生这种情况,那么您需要进一步优化设计和约束以防止发生这种情况。大多数情况下,应用程序中都会对这类事情进行强化,但如果您能够获得额外的数据完整性保证,那么在数据库中也可以这样做。

在大多数关系数据库系统中,多对多关系,通常由两个包含相关数据的数据库表和一个链接这些数据的中间表组成。大概是这样的:

Posts
--------
ID
Title
Content

Tags
--------
ID
Title

PostTags
--------
PostID
TagID
Products
--------
ID
Name
Description

Categories
--------
ID
Title
ParentCategoryID

ProductCategories
--------
ProductID
CategoryID
这通过中间表在
Posts
标记之间创建了一种间接关系。(请注意,如果您确实需要,中间表也可以有一个
ID
列,但可能不需要它。请记住,向该表中添加更多列可能会带来创建非直观建模的风险。这通常不是什么大问题,但在对数据建模时需要注意。向中间表中添加更多列此表可以使数据模型之间的“关系”本身成为模型。)

对于食物类别,您添加了一个额外的复杂性层次,因为类别是分层的。然而,这可能只需要一个自引用列就可以实现。大概是这样的:

Posts
--------
ID
Title
Content

Tags
--------
ID
Title

PostTags
--------
PostID
TagID
Products
--------
ID
Name
Description

Categories
--------
ID
Title
ParentCategoryID

ProductCategories
--------
ProductID
CategoryID
这里的主要区别是
Categories
表现在有一列指向该表自己的
ID
。因此,在该表中有一个
Food
记录,该记录具有
ID
值,并且由于它是层次结构中的顶级,因此
ParentCategoryID的
null
值。然后,
Organic
记录将有自己的
ID
值,并在其
ParentCategoryID
字段中使用
Food
记录的
ID
值。这将创建层次结构,而不会给数据模型增加不必要的复杂性


请注意,这种设计本身并不能阻止某人,比如说,将某物同时归类为
食品
有机
。如果不希望发生这种情况,那么您需要进一步优化设计和约束以防止发生这种情况。大多数情况下,应用程序中都会对这类事情进行强化,但如果您能够获得额外的数据完整性保证,那么在数据库中也可以这样做。

查看多对多下面查看多对多下面这是非常有见地的。谢谢至于层次结构的类别,我想你指的是相关的列表?@brainydexter:我把类别层次结构描绘成一个树状结构。每个父节点可以有多个子节点,每个子节点可以有一个父节点。这不是你想的吗?类别是否也需要具有多对多关系?每个父节点可以有多个子节点,每个子节点可以有一个父节点。这是正确的,也正是我所看到的情况。这是非常有洞察力的。谢谢至于层次分类,我想你指的是关联的