数据库建模:针对多个元素的多个类别的最佳方法

时间:2011-12-30 01:02:49

标签: php mysql database modeling

假设我有10本书,每本书都分配了一些类别(例如:php,编程,烹饪,cookies等)。

将此数据存储在数据库中后,我想搜索与某些类别相匹配的书籍,并输出每对书籍的匹配类别。

快速简便的代码搜索的最佳方法是什么:

1)为每本书创建一个包含所有类别的列,书行将是唯一的(每行中用逗号分隔的categs) - > 1NF的非正规化

2)创建一个列,每行只有一个类别,每本书有多行

我认为如果我将类别1逐一存储(方法2),对其他查询更容易,但对于特定类型的搜索更难。这是对的吗?

我正在使用PHP和MySQL。

PPS:我知道多关系设计,我不喜欢每次都加入表格。我正在为某些表使用不同的连接,但这不是问题。我在问这种搜索的数据库设计最好的方法是什么:用户类型烹饪,饼干,土豆,我想输出有1,2个或更多匹配的categs的书籍。我正在为这件事找一个快速查询或php匹配技术......告诉我你的品脱观点。希望我明白了

4 个答案:

答案 0 :(得分:2)

您要做的是有一个用于书籍的表格,一个用于分类的表格,以及一个用于连接书籍和类别的表格。像这样:

<强>书

book_id | title | etc

<强>类别

category_id | title | etc

<强> book_categories

book_id | category_id

这称为多对多关系。您可能应该谷歌了解更多信息。

答案 1 :(得分:2)

使用方法2 - 每本书多行,每行存储一个类别。这是使搜索特定类别变得容易的唯一方法。

这种设计避免了repeating groups within a column,因此对于First Normal Form来说是好的。

但这不仅仅是一次学术活动,它是一种适用于各种事物的实用设计。请参阅我对Is storing a comma separated list in a database column really that bad?

的回答

答案 2 :(得分:1)

这种关系是多对多(一本书可以有多个类别,一个类别可以在几本书中使用)。

然后我们有以下内容:

Diagram

知道了吗?

=]

答案 3 :(得分:0)

我建议使用方法编号2.这是因为方法1需要对类别列进行全文搜索。

您可以通过将其分成两个表来取得一些成功:一个表每本书有一行和一个唯一的ID(调用表books),另一个表每个类别和参考有一行第一个表中的book id(调用表bookcategories)。然后,如果您只需要图书数据,则可以使用表格books,如果您需要类别join两个表格。