假设我有10本书,每本书都分配了一些类别(例如:php,编程,烹饪,cookies等)。
将此数据存储在数据库中后,我想搜索与某些类别相匹配的书籍,并输出每对书籍的匹配类别。
快速简便的代码搜索的最佳方法是什么:
1)为每本书创建一个包含所有类别的列,书行将是唯一的(每行中用逗号分隔的categs) - > 1NF的非正规化
2)创建一个列,每行只有一个类别,每本书有多行
我认为如果我将类别1逐一存储(方法2),对其他查询更容易,但对于特定类型的搜索更难。这是对的吗?
我正在使用PHP和MySQL。
PPS:我知道多关系设计,我不喜欢每次都加入表格。我正在为某些表使用不同的连接,但这不是问题。我在问这种搜索的数据库设计最好的方法是什么:用户类型烹饪,饼干,土豆,我想输出有1,2个或更多匹配的categs的书籍。我正在为这件事找一个快速查询或php匹配技术......告诉我你的品脱观点。希望我明白了答案 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)
这种关系是多对多(一本书可以有多个类别,一个类别可以在几本书中使用)。
然后我们有以下内容:
知道了吗?
=]
答案 3 :(得分:0)
我建议使用方法编号2.这是因为方法1需要对类别列进行全文搜索。
您可以通过将其分成两个表来取得一些成功:一个表每本书有一行和一个唯一的ID(调用表books
),另一个表每个类别和参考有一行第一个表中的book id(调用表bookcategories
)。然后,如果您只需要图书数据,则可以使用表格books
,如果您需要类别join
两个表格。