簡體   English   中英

數據庫設計 - 選擇查詢的“單獨的表與一個表”

[英]Database design - “Separate Tables Vs One table” for Select Queries

我有一個類似於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'

它工作正常,但根據標准的數據庫設計,我認為我應該將類別和作者列分隔成單獨的表(尤其是作者),並將它們的主鍵用作books 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

那么我應該將第一個表分成單獨的表還是第一個表設計在這種情況下更好?

這個問題得到了Edgar F. Codd先生本人的回答 - 他是所有RDBMS構建的關系模型的發明者。

在發布關系模型論文后不久,他和他的團隊隨后發表了關於所謂正常形式的論文。 它們很少,但前3個(至少)通常被認為是強制性的:

當您閱讀它們時,您會發現您的初始設計違反了2NF並且您已經找到了或多或少尊重它的解決方案。 繼續使用符合NF標准的設計,毫無疑問。

詳細說明您對Join的表現的擔憂。 只要滿足以下條件,這不是問題:

  • 您的數據庫架構設計得很好(至少符合2NF)
  • 你使用外鍵鏈接表( MySQL的文檔
  • 你加入他們的FK表
  • 您擁有有效運行數據所需的硬件資源

例如,在使用InnoDB的MySQL上,在使用外鍵的2NF兼容模式上,FK的連接性能將是您最不關心的事情之一。

從歷史上看,MySQL中有一個數據庫引擎--MyISAM--它不支持外鍵約束。 也許它是關於糟糕的連接性能的反饋的主要來源(當然,不良的模式設計)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM