[英]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的表現的擔憂。 只要滿足以下條件,這不是問題:
例如,在使用InnoDB的MySQL上,在使用外鍵的2NF兼容模式上,FK的連接性能將是您最不關心的事情之一。
從歷史上看,MySQL中有一個數據庫引擎--MyISAM--它不支持外鍵約束。 也許它是關於糟糕的連接性能的反饋的主要來源(當然,不良的模式設計)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.