2013-03-20 17 views
4

讓我們假設我有N個書店的N個表。由於每個表具有不同的方案(列的數量和類型不同),但是對於所有書店表來說,都有相同的列集合;如何將N數據庫表與一個主表綁定?

現在我想創建一個只有幾列的「MasterTable」。

| MasterTable | 
|id. | title| isbn|  
| 1 | abc | 123 | 


| MasterToBookstores | 
|m_id | tb_id | p_id | 
| 1 | 1 | 2 | 
| 1 | 2 | 1 | 


|  BookStore_Foo   | 
|p_id| title| isbn| date | size|  
| 1 | xyz | 456 | 1998 | 3KB | 
| 2 | abc | 123 | 2003 | 4KB | 

|  BookStore_Bar     | 
|p_id| title| isbn| publisher | Format |  
| 1 | abc | 123 | H&K  | PDF | 
| 2 | mnh | 986 | Amazon | MOBI | 

我的問題是以這種方式保存數據嗎?對於這種情況和類似情況,最佳做法是什麼?我可以給特定的Bookstore表格添加數字,這將有助於我管理整個表格嗎?

有沒有更好的方法做這樣的事情?

+0

每個書店的圖書表是否位於不同的數據庫中,還是都在同一個數據庫中? – 2013-03-26 22:14:55

回答

5

如果您至少有兩列所有其他表使用它,那麼您可以爲所有書籍使用基表,並使用基表中的ID爲其餘數據添加更多表。

UPDATE:

如果您使用實體框架連接到您的數據庫,我建議你試試這個:

創建實體模型是這樣的:

Entities model

然後讓實體框架爲您生成數據庫(從Model更新數據庫)。注意這使用繼承(不在數據庫中)。

如果您有任何疑問,請告知我。

2

推薦數據模型:
1.有一個主數據庫,從而節省了主數據
2.在主數據庫中的維表,transtional複製到分佈式書店數據庫
3.您可以選擇使用可更新scriscriber或合併複製也是一個不錯的選擇
4.每個分佈式書店數據庫仍然獨立工作,但主數據或者通過合併複製或可更新訂閱者合併。
5.如果要確保主數據完整性,則只能使用只讀訂閱服務器,並使用跨轉複製將主數據分發到分佈式數據庫中,但在此設計中,需要在master數據庫中存儲過程以註冊您的尺寸數據。確保沒有雙跳問題。

5

我覺得你很迷惑「商店」和「書」的概念。

從您的評論和示例數據看來,問題在於擁有不同的書籍屬性集,而不是商店。如果是這樣,你需要類似這樣的結構:

enter image description here

符號:enter image description here表示繼承。 BOOK是「基類」,BOOK1/BOOK2/BOOK3是各種「子類」。當實體共享一組屬性或關係 時,這是常用策略。有關此概念的更完整說明,請在ERwin Methods Guide中搜索「子類型關係」。

不幸的是,當前的關係數據庫並不直接支持繼承,因此您需要將此層次轉換爲普通表。通常有這樣做3個策略,在這些文章中描述:

注意:上面的結構允許不同的書類型進行內部混合同一家書店。讓我知道這是不可取的(即你需要在任何給定的書店只有一個類型的書籍)...


阿卡。類別,子類別,子類型,泛化層次等。

即,取決於他們需要哪些屬性的書籍類型。

在這種情況下,所有類型的書籍都與商店存在多對多的關係。

2

我建議你有兩個表:

書店

idnamesomeMoreColumns

idbookStore_idtitleisbndatepublisherformatsizesomeMoreColumns

可以很容易地看到這裏的關係:一個bookStore有很多books

請注意,即使某個表中的某行沒有某個​​列的值,我也只是在一張表中放入所有BookStore表中的所有列。

爲什麼我更喜歡這種方式:

1)將所有的數據從BookStore表,只有幾列將永遠對錶books值(爲例,sizeformat如果你沒有電子書版本)。其他專欄可以在某一天填寫(您可以爲您的電子書設置date,但是您的表BookStore_Bar中沒有此列,這似乎是指電子書)。這樣,如果有一天你想更新它,你可以從你所有的書中獲得更詳細的信息。如果你有一堆表BookStore,可以說12,你將無法輕鬆處理你的數據。我說的是,如果你想運行一些查詢到所有的書(這意味着所有的表),則必須至少在三個方面:

  • 第一:運行手動查詢到每個在12個表格中合併數據;

  • 第二個:在你的FROM子句中寫入一個包含12個連接或設置12個表的查詢來查詢你所有的數據;

  • 第三個:取決於某些腳本,存儲過程或軟件爲您做的第一或第二種方式,我剛剛說過;

我喜歡能夠儘可能簡單地處理我的數據,並且不依賴於其他腳本或軟件,除非我真的需要它。

3)作爲MySQL(因爲我知道更多的MySQL),您可以在您的表books上使用partitions。這是一個高級別的數據管理,您可以將表中的數據分配到磁盤上的多個文件,而不是一個,因爲通常分配一個表。在處理同一個表中的大量數據時它非常有用,並且可以根據數據分配計劃加快查詢速度。讓我們看一個例子:

可以說,你已經有12個不同的書店,但在我的數據庫模型下。對於表books中的每一行,您將與12個bookStore中的一個有關聯。如果通過bookStore_id對數據進行分區,它將與您有12個表格幾乎相同,因爲您可以爲每個bookStore_id創建一個分區,因此每個分區只處理相關數據(與bookStore_id匹配的數據)。

假設您想在(1,4,9)中查詢表booksbookStore_id。如果你的查詢真的只需要這三個分區來給你想要的輸出,那麼其他的查詢就不會被查詢,並且它會像查詢每個分離的表一樣快。

您可以刪除一個分區,另一個不會受到影響。您可以添加新的分區來處理新的書店。您可以對分區進行子分區。您可以合併兩個分區。簡而言之,您可以將單個表格books轉換爲易於處理的多存儲表格。

副作用:

1)我不知道所有的表分區的,所以這是很好的參考學習所有重要的點來創建和管理的文檔。

2)照顧數據與定期備份(轉儲),因爲您可能有一個人口稠密的表books

我希望它能幫助你!

相關問題