我有一个类似于以下的MySQL表
book-id category author author_place book_name book_price --------other 50 columns directly related to book-id
1 adventure tom USA skydiving 300
2 spiritual rom Germany what you are 500
3 adventure som India woo woo 700
4 education kom Italy boring 900
5 adventure lom Pak yo yo 90
.
.
4000 spiritual tom USA you are 10
当你看到有大约4000行和大约55列时,我使用这个表主要用于选择查询,也许在2-3周之后添加或更新新书
我对类别和作者列有疑问
现在,如果我需要按类别和作者选择表格,我可以简单地执行
SELECT * from books Where author = 'tom'
Select * FROM books WHERE category='education'
它工作正常,但根据标准数据库设计,我认为我应该将类别和作者列分隔为单独的表(尤其是作者),并将他们的主键用作书籍table
中的外键
像这样的东西
book-id categ_id author_id book_name book_price --------other 50 columns directly related to book-id
1 1 1 skydiving 300
2 2 2 what you are 500
3 1 3 woo woo 700
4 3 4 boring 900
5 1 5 yo yo 90
.
.
4000 3 1 you are 10
categ_id category_name
1 advernture
2 spiritual
3 education
. .
. .
30 something
author_id author country
1 tom USA
2 rom Germany
3 som India
4 kom Italy
5 lom Pak
但是每次我按作者或类别进行选择查询时我都必须使用连接表,我觉得这样效率很低,这样的事情
SELECT * FROM Books LEFT JOIN authors on authors.author_id = books.author_id WHERE books.author_id =1
SELECT * FROM Books LEFT JOIN categories on categories.categ_id = books.categ_id_id WHERE books.categ_id =1
那么我应该将第一个表分成单独的表还是第一个表设计在这种情况下更好?
答案 0 :(得分:3)
这个问题得到了Edgar F. Codd先生的回答 - 他是构建所有 RDBMS 的关系模型的发明者。
在发布关系模型论文后不久,他和他的团队随后发表了关于所谓正常形式的论文。它们很少,但前3个(至少)通常被认为是强制性的:
当您阅读它们时,您会发现您的初始设计违反了2NF并且您已经提供了或多或少尊重它的解决方案。继续使用符合NF标准的设计,毫无疑问。
详细说明您对Join的表现的担忧。只要满足以下条件,这不是问题:
e.g。在使用InnoDB的MySQL上,在使用外键的2NF兼容模式下,FK的连接性能将是您最不关心的事情之一。
历史上,MySQL中有一个数据库引擎--MyISAM--不支持外键约束。也许它是关于不良连接性能的反馈的主要来源(当然,不良的模式设计)。