我有食品,可以属于多个类别,一个类别可以有许多食品。类别在性质上是分级的:
我正在努力设计数据库模式,同时考虑到这两个约束。我应该如何继续模式设计来支持这一点?
作为另一个例子,我想到Stack溢出有一个类似于此的系统.标签。每个问题有多个标签,每个标签有多个问题。这是如何实现的?如何使这个设计适应我的分类需求?
发布于 2011-12-19 20:05:13
在大多数关系数据库系统中,多对多关系通常由两个数据库表和一个连接它们的中间表组成,其中两个表包含所述数据。就像这样:
Posts
--------
ID
Title
Content
Tags
--------
ID
Title
PostTags
--------
PostID
TagID
这通过中间表在Posts
和Tags
之间创建了一种间接关系。(注意,如果您真的需要中间表,也可以有一个ID
列,但可能不需要它。还请记住,向此表中添加更多列可能会导致创建不直观的建模。这通常不是什么大问题,但当你对数据进行建模时,要注意这一点。向该表中添加更多列可以使数据模型之间的“关系”成为模型本身。)
对于您的食物类别,您添加了一个额外的复杂层,因为这些类别是分层的。然而,这很可能是通过一个自我引用的列来实现的。就像这样:
Products
--------
ID
Name
Description
Categories
--------
ID
Title
ParentCategoryID
ProductCategories
--------
ProductID
CategoryID
这里的主要区别是,Categories
表现在有一个列,该列指向该表自己的ID
。因此,表中有一个Food
记录,其中有一个ID
值,因为它是层次结构中的顶层,所以是ParentCategoryID
的null
值。然后,Organic
记录将有自己的ID
值,并在其ParentCategoryID
字段中使用Food
记录的ID
值。这将创建该层次结构,而不会给数据模型增加不必要的复杂性。
请注意,这个设计本身并不能阻止某人将某些东西归类为Food
和Organic
。如果这是不应该发生的,那么您将希望进一步完善设计和约束以防止这种情况发生。在大多数情况下,这类事情在应用程序中是很难对付的,但是如果您能够得到数据完整性的额外保证,那么在数据库中这样做也是很好的。
发布于 2011-12-19 18:14:39
这是一种many-to-many
关系。一个问题可以有很多标签,一个标签可以有很多问题。在数据库中,这是由一个附加表(tag id
和question id
)表示的。
https://stackoverflow.com/questions/8565522
复制相似问题