2008-12-12 145 views
2

有沒有人有任何建議在數據庫中創建元表?這些表格將用於模擬數據庫中的表格,使用數據庫。這是爲了在您想要輕鬆地將結構(更多字段)添加到數據庫時,而不必擔心所涉及的所有技術問題。我唯一的例子看起來是這樣的:在數據庫中創建Metatable表

表:元表 字段:表名,tableDescription

表:MetaFields 字段:表名,字段名,fieldDesc,fieldDesc

表:MetaCodes 領域: tableName,fieldName,codeName,codeValue等...

我從來沒有真正使用過這樣的事情,並想知道是否有任何「疑難雜症」尋找。

是這樣的合理維護或你會建議反對嗎?

回答

9

你在說什麼是一個靈活的模式模型,通常稱爲Open Schema模型或Entity-attribute-value模型。谷歌這些,你會得到很多的參考和文章。

我也建議你不要回避你添加列的設計。當設計中的波動水平不那麼重要時,我經常會看到人們採取這種方法。編寫新的數據容器(表,列等)的腳本並不難。

+0

我發現通過作爲RDBMS一部分提供給您的設施提供可擴展模式要涼爽得多。許多主要企業應用程序(例如Peoplesoft,SAP級別)都會創建表並根據需要向這些表添加列。這太酷了。 – keithwarren7 2008-12-12 22:12:28

+2

對於那個知道你住在哪裏,並且必須在生產中保持這個東西的瘋狂的瘋子來說,這不會太酷。 http://www.codinghorror.com/blog/archives/001137.html – Turnkey 2008-12-13 01:08:35

3

正如keithwarren7建議的那樣,做一些Google-ing,你會看到(根據你的評論),這樣做完全不是很酷。 (好吧,這是在某些情況下,但幾乎總是不,IMO)

什麼冷靜,遠遠超過你會覺得,在他們打算使用的方式使用關係數據庫較爲少見,採用經過深思熟慮的模式設計。您會發現這會爲您提供更好的數據完整性,性能,使用更少的存儲空間,並且通常比Entity-Attribute-Value模型更容易使用。你會看到一些明顯的缺陷,例如,你將負責自己執行參照完整性,而不是數據庫。

無論如何,在您繼續使用之前,請仔細研究這個想法(超出stackoverflow),因爲一旦您實現了這種方式,改變主意是件大事。

0

而不是使用表和字段來表示動態結構,您可以始終使用XML數據的單個字段。許多主流RDBMS的許可證索引XML中的屬性/元素,因此您的查詢甚至可能是高性能的。

+0

我使用它來存儲非常規屬性,我不會對這些進行查詢,所以我不依賴於一些'xml魔法'在RDMBS中。 (現在它比XML更多的JSON,但這個想法是一樣的)。 – Javier 2008-12-12 22:02:35

5

我認爲,採用完全實現的關係數據庫,忽略幾乎所有功能,並在關係數據庫之上構建自己的關係數據庫的想法是等待發生的麻煩。

建立你自己的模型聽起來很「酷」。

當然,你必須建立你自己的元級空間管理。這是脖子上的溫和疼痛。

查詢執行,優化,處理索引和什麼是非常複雜。

然後,有交易,鎖定,死鎖檢測等。這很難得到正確的。但是,一旦你得到它的工作,它將有一個巨大的「酷」因素。

此外,你需要發明一個API。 ODBC工作在較低的水平,並且您希望在更高層次上工作,因此您必須創建自己的「酷」版本的ODBC。

「酷」的因素是這項工作的最佳王牌。你將花費數年時間才能實現這一目標。

1

如果你的老闆想要真的真的酷,並且想要動態元數據,忘記笨重的舊關係數據庫 - 嘗試RDF和語義數據引擎! RDF允許您以相同的方式存儲和查詢元數據和數據。數據庫中的每個實體都是完全動態和自我描述的。有關示例實現,請參見Sesame

RDF是EAV設計的邏輯擴展。

3

大多數情況下,元表模式首先破壞了使用關係數據庫的目的。除了基本的事務/ ACID屬性之外,關係數據庫在將兩大特性添加到系統中最爲有用:a)與諸如報表生成器之類的應用程序共享數據,以及b)允許臨時查詢。

如果上述兩個都不適用,並且您仍然希望是通用的,則其他一些數據持久性解決方案可能會更好。你可以很優雅滾滾像伯克利DB自己的解決方案或嘗試在通用架構的變化:

http://theprogrammersparadox.blogspot.com/2008/06/structuring-noun-verb-data.html

保羅。

2

我同意評論說E-A-V看起來很酷,但並不酷。它正在做大量的工作,結果是後現代或完全適得其反。

我在哪裏使用了我自己的包含元數據的用戶表,用於比較兩個不同的數據庫以找出它們在哪裏分歧。比較兩個相同結構的模式之間的值很簡單。檢測模式之間的差異更爲微妙,並涉及比較元數據。

我的方法是將數據從兩個或多個數據庫的元數據表複製到我的「元數據庫」中的用戶定義的元數據表中,然後繼續進行比較。在大約一個小時內,我發現一列在一個數據庫中被定義爲實數,在另一個數據庫中被定義爲整數。數月來,這一直躲在DBA之外。我還發現了其中一個或另一個數據庫丟失的幾列。

今天,有些工具會爲你做這種比較。但是,如果您瞭解DBMS爲您構建的系統表的架構,那麼實際上並不難。

0

對不起,正如其他海報指出的那樣,重新發明輪子。

如果要使用此數據,大多數數據庫都有包含數據庫模式的表。這可以用於反思的目的。

任何好的數據庫手冊都應該告訴你如何訪問這些表。

0

對一個大型數據表中的大型數據集進行一些性能測試。如果你的老闆看到表現緩慢,他/她不會使用「酷」這個詞。