0

我有這種情況下,我需要數據庫表設計的建議。在這種情況下正確的mysql表設計/關係

背景

我開發在PHP的應用程序(cakephp的要準確)。我們在上傳XML文件的位置解析文件並將數據保存在數據庫中。這些XML可能是文件或網址提要,這些來自各個供應商的數據。它的目的是從源URL收集各種場地數據,場館可以像酒店,戲院,學校,餐廳等

問題

初始表爲這些場館結構如下事情。表最初是爲了存儲通用信息而設計的。

隨着來自不同來源的數據越來越多,我意識到不同類型的場館有很多屬性。

例如 一個酒店可以有一個像

price_for_one_day, types_of_accommodation, Number_of_rooms etc 

其中一些屬性爲學校不會有他們,但有不同的一組attributes.Restaurant的會有一些其他屬性。

我的第一個想法是創建兩個表名爲vanue_attribute_names,Venue_attributes

##table venue_attribute_names 
_____________________________ 
id 
name 

##table venue_attributes 
________________________ 
id 
venue_id 
venue_attribute_name_id 
value 

所以,如果我發現任何新的屬性我想創建一個在屬性表有關係的價值。但我懷疑這不是正確的做法。我相信可以有任何其他的方法呢?此外,如果表格變得巨大,則可能會因性能問題,因爲連接數增加以及sql查詢

正在創建儘可能寬的表以及所有可能的屬性,因爲列是正確的方法嗎?請告訴我。如果有任何我可以參考的鏈接,我可以關注它。謝謝

回答

0

如果你堅持關係數據庫,就是這樣。你列出的選項幾乎是他們可以給你的。

對於您的情況MongoDB(或其他面向文檔的NoSql系統)可能是一個不錯的選擇。這個數據庫系統非常好,如果你有很多不同屬性的記錄。

+0

不幸的是選擇另一個數據庫現在不是一個選項。發生了很多事情,除了設計外,我們幾乎完成了。我解釋的只是應用程序的一部分,還有更多。 – 2013-02-19 12:42:11

+0

沒有必要將所有東西都放到MongoDb中。只需將XML中的內容保存到MongoDb中,並使用服務(-class)對其餘應用程序進行訪問即可。 – BetaRide 2013-02-19 12:57:50

2

這是一個令人驚訝的常見問題。

您描述的設計通常稱爲「實體/屬性/值」或EAV。它的好處是允許您存儲各種數據,而無需事先知道該數據的模式是什麼。它的缺點是難以查詢 - 想象一下,在特定位置找到所有的酒店,每天的房間價格介於100美元至150美元之間,其名稱以「Waldorf」開頭。針對所有屬性編寫查詢並快速應用布爾邏輯變得比您想要的要困難得多。您也不能輕鬆應用數據庫級一致性檢查,例如「hotel_name不能爲null」,或「daily_room_rate必須是數字」。

如果這些擔心都不擔心,也許您的設計有效。

第二個選項是將傳統關係結構中的「公共」字段存儲起來,但將變量數據存儲在某種文檔中 - 例如MySQL supports XML。這使您可以定義XML模式,並使用XPath等進行查詢。

由於您可以應用模式約束,因此此方法爲您提供了比EAV更好的數據完整性。這意味着你必須爲你正在處理的每種類型的數據創建一個模式。對你來說這可能沒有問題 - 我猜這家公司每週都不會增加數十種新的場地類型。

使用XML查詢的性能可能會非常棘手,而一般的工具和開發方法將比「僅SQL」更難構建。

如果您想堅持使用關係數據庫,最後一個選擇就是簡單地咬住子彈並使用「純」SQL。您可以創建一個具有常用屬性的「主」表格,以及一個包含餐廳特定屬性的「餐館」表格,以及一個包含酒店屬性的「酒店」表格。只要您擁有可管理的場地類型數量,這種方式就行得通,而且不會出現難以預料的情況。

最後,您可以看看NoSQL選項。

+0

謝謝。雖然我知道我可以將數據保存在xml文件或某些文件中,但我從來沒有這樣用過,但我始終認爲將數據存儲在數據庫中是錯誤的想法。我現在看到在某些情況下我錯了。我會嘗試你說的話,看看我能否得到我想要的。 – 2013-02-19 13:30:14