2011-07-29 82 views
2

我正在爲我的第一個項目設置數據庫中的表。 (Exciting!)MySQL數據庫設計:一對一,多對多,多對一還是太多?

我很難決定我需要建立什麼類型的關係。

我有以下基本表計劃。

products 
----- 
id 
product_name 
product_details 
product_url 
product_img 
category_id 
business_id 


categories 
----- 
id 
category_name 
category_description 
category_slug 


businesses 
---------------- 
id 
business_name 
business_phone 
business_address 
business_city 
state_id 
business_zip 

state 
----- 
id 
state_name 

我被卡住的地方在於決定建立什麼類型的關係。

每個產品只能屬於 1個類別,只能屬於1個業務

對於業務表我想知道如果它是一個更好的主意打出來的城市郵政編碼分成不同的表格。

我希望能夠通過類別和城市, 例如檢索產品:在「洛杉磯」鞋',或者只是「鞋」或全部產品在「洛杉磯」

任何人都可以提供一些見解或分享他們的經驗。由於我正在準備設置我的表格,所以我寧願制定出現在這些情景,然後通過開發的一半。

回答

3

您的設計是好的 - 它很乾淨。我無法在任何地方看到多對多的東西 - 它似乎是一個平直的層次結構。

此外,你的思考過程似乎很清晰 - 不斷問自己這些問題,你會沒事的。

不過,我有以下建議:

首先,總是在命名奇異,businessbusinesses您的表。

其次,儘量避免前綴表名的列名,因此name,不business_name - 當你在查詢中引用它,這是無論如何顯而易見的:business.name(在business.business_name額外business_是多餘的)

而且,因爲拉鍊是在一個城市,和城市的狀態,儲存城市和國家的業務是冗餘數據,所以你應該這樣做:

business 
---------------- 
id 
name 
phone 
address 
zip_code_id 

zip_code 
-------- 
id 
city_id 
name 

city 
---- 
id 
state_id 
name 

state 
----- 
id 
name 

回答您的問題重新查詢,你可以得到什麼你需要這個模式。除非你真的有麻煩,否則我不會在這裏發佈它,但是它們是非常簡單的查詢,所以我會留給你解決。

+0

非常感謝您的幫助和建議,特別是關於不在列名前加字的問題,它非常簡潔。再次感謝。 – 404error

-1

你應該權衡優點和缺點。

有了多對多的關係,如果你正常化,那麼你最終會得到更多的表,並且需要更多的連接。如果您必須經常檢索這些記錄,那麼連接將非常昂貴並且會增加很多開銷。

如果您決定將東西放入一個大表中,那麼您將增加數據冗餘,這會浪費存儲空間,但如果由於更好的索引使用並且沒有聯接而總是查詢該列組合,則值得。但它增加了應用程序開發的複雜性特別是當您在非規範化時在不同表中具有相同的列時,最終必須記住更新這兩個表,這會增加數據不一致的風險,如果您忘記更新其中任何一個表。

總之

所以這真的取決於你的情況,如果性能與特點是關鍵,你不介意增加複雜性和可能的​​數據完整性問題,然後拿上一個非規範化的做法。如果性能不是一個大問題(不是很多行,不是很多用戶,綽綽有餘的硬件,速度並不關心),那麼分離關係表將會減少存儲空間(自從如此便宜),增加數據完整性,減少數據不一致性並降低開發複雜性。

+0

感謝您的回覆。複雜性不是我現在需要的,謝謝。 – 404error