数据库设计 - "单独的表与一个表"选择查询

时间:2017-12-05 06:11:43

标签: mysql database

我有一个类似于以下的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

那么我应该将第一个表分成单独的表还是第一个表设计在这种情况下更好?

1 个答案:

答案 0 :(得分:3)

这个问题得到了Edgar F. Codd先生的回答 - 他是构建所有 RDBMS 的关系模型的发明者。

在发布关系模型论文后不久,他和他的团队随后发表了关于所谓正常形式的论文。它们很少,但前3个(至少)通常被认为是强制性的:

当您阅读它们时,您会发现您的初始设计违反了2NF并且您已经提供了或多或少尊重它的解决方案。继续使用符合NF标准的设计,毫无疑问。

详细说明您对Join的表现的担忧。只要满足以下条件,这不是问题:

  • 您的数据库架构设计合理(至少符合2NF)
  • 您使用外键链接表格(MySQL's docs
  • 你用他们的FK加入表格
  • 您拥有运行数据所需的硬件资源 有效地

e.g。在使用InnoDB的MySQL上,在使用外键的2NF兼容模式下,FK的连接性能将是您最不关心的事情之一。

历史上,MySQL中有一个数据库引擎--MyISAM--不支持外键约束。也许它是关于不良连接性能的反馈的主要来源(当然,不良的模式设计)。