2012-07-02 90 views
4

我正在使用標準的SQL數據庫,並試圖弄清楚是否拼合一張表或使其更「面向對象」。對我而言,較小的表格更易於閱讀,但需要連接表格並且具有一對一的關係。這通常是一種很好的做事方式,還是在SQL世界中被壓抑了?SQL一對一關係vs扁平化

我有具有以下屬性表:

MYTABLE 
- ID 
- NAME 
- LABEL 
- CREATED_TS 
- MODIFIED_TS 
- CREATED_USER 
- MODIFIED_USER 

對我來說,創建/修改的字段將自己的對象。實際上還有更多的領域,所以它不僅僅是這麼小。我會認爲創建另一個名爲「MYTABLE_MODINFO」的表或類似於具有CREATED和MODIFIED字段的表,並且當它們需要數據時它們將被連接。這些表格不是高訪問表格,它們不會每分鐘甚至數百行查詢數量很大,所以我不認爲效率會成爲一個問題。

所以主要是我想知道的是這是一個普遍接受的設計,或者你應該一般保持你的桌子結構平坦?

+4

修改信息不是一個不同的「對象」 - 它本質上是主要記錄的一部分。你爲什麼要把它們分開? – Cylindric

+1

雖然,由於'Created _...'行將在整個過程中重複,您可能會考慮只更新行 - 創建者是第一個修改器(雖然性能折衷)。另外,請不要在列名中使用數據類型後綴 - 您可能會用自己的腳攻擊自己。使用'createdAt','createdBy','modifiedAt','modifiedBy'等。 –

回答

2

您應該創建在同一個表的審計信息。原因是這些數據是該行的一部分,是一對一的關係,所以將它分開是沒有意義的。

如果您想存儲審計信息(審計跟蹤/歷史記錄),那麼您可以創建另一個表,但是在大多數情況下,我已經看到通過「複製」數據並創建代理鍵和映射回到原始行。我在報價單中列出重複的原因是因爲審計固有地要求重複舊數據......如果它在寫入後是連接且可變的,那麼它不是真正的審計。

只是我的兩分錢。如果沒有意義,那我可以舉一些例子。但是,要點是每行只會有一條當前的修改信息,所以爲什麼要把它分開呢?

1

避免數據庫'一對一',你會失去性能,可伸縮性,獨立性。你能想象如果你想每個ID存儲2張圖片會發生什麼?你會創建另一個領域,還是你會重複這一行?......想要升級時創建關係以獲得更多自由更容易,請查看本教程。

http://www.youtube.com/watch?v=Onzm-PxSjtE

http://folkworm.ceri.memphis.edu/ew/SCHEMA_DOC/comparison/erd.htm

http://www.visual-paradigm.com/product/vpuml/provides/dbmodeling.jsp

除此之外,你應該正常化的數據庫,以確保一切都在可能的最佳狀態。請記住,最重要的是採取您需要的並適應它。

http://databases.about.com/od/specificproducts/a/normalization.htm

http://www.youtube.com/watch?v=xzeuBwHkKxw

+0

當列數達到15+時,如果有定位之類的明確分組,例如「X,Y,寬度高度」,那麼情況如何?即使它們肯定仍然是一對一的關係,將它們移出是否有意義?對我來說,當表變得如此龐大時,尤其是當你試圖在網格中查看數據時,會變得很煩人。 –

+0

列數是「不重要」(即使每個表有4096列),重要的是數據庫關係,如果您必須創建15個表,則沒有問題,因爲它具有正確的索引,PK和FK只要確保創建正確的結構 – jcho360

1

在我看來,RDBMS設計與面向對象的方法不一樣。你提到的例子不是不同的對象域,而是你的記錄的數據繼承。由於不會有大量查詢/執行表的開銷,因此您應該將它們保留在同一個表中以用於審計目的,並且還可以更輕鬆地處理標準化數據。