2011-09-07 243 views
1

對於我設置的項目,我需要一個非常動態的數據結構。我將存儲我沒有定義的記錄。一個記錄可以由5列,另一種可能是10在sql中查詢數據字典的最佳方法

爲了支持這一點,我想用一個表有以下的列:

ResultId 的recordId RecordTypeId 重點 價值

這支持所有可能的方案,但我有幾個問題。

  • 這是最好的方法還是有更好的選擇,我錯過了?
  • 什麼是一種很好的方式來查詢這個,並得到他們的方式我的記錄?我將定義存儲在不同的表中,告訴我每個記錄類型存儲哪些列。我已經看過需要動態buildp的PIVOT語句,因爲您需要以數組樣式提供字段(儘管可以通過存儲過程提供,我猜)
  • 性能如何保持大量記錄?
  • 使用諸如EF/Linq之類的東西很方便嗎?

這將在.NET 4 C#中用SQL2008R2 Express後端進行編碼。我正在尋找一些最佳做法。

更新!再澄清一點:我需要存儲來自不同的,未知的查詢的數據結果集。我不知道會有多少個查詢定義,或者它們的外觀如何。該數據庫中的數據僅用於處理。用戶甚至不知道這些表格存在,將不會有輸入,也不會有任何報告或任何數據以任何方式觸及屏幕。結果集用於與其他結果集進行比較,全部通過代碼進行比較。我需要的是一種高度動態的方式來存儲這些記錄,這些記錄在涉及大量記錄時保持執行。

我想到了另一種選擇是:

ResultId 的recordId 字段1(SQL_VARIANT) 域2(SQL_VARIANT) 場3(SQL_VARIANT) 字段4(SQL_VARIANT) ...

這是一個更好的理念?

+0

用戶如何創建記錄以及如何維護數據? – Mark

+12

這是真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的非常糟糕的數據結構,會造成很多問題。 – JNK

+0

@Mark:用戶實際上並不創建記錄,記錄是另一個數據庫上查詢的結果。而且會有不同的定義 – Jasper

回答

15

我知道這並不回答這個問題,但我不能拒絕發佈(儘管我很可能會被拒絕投票)。它說明了這一點。直接從每日跆拳道:

這是我的第二次採訪,它打開漂亮的談話。

「我們正考慮在數據庫中存儲表名和列,」 接受採訪時說,「這是一個浮動的想法。」

我回答說:「不是根據 創建表和存儲數據,而是根據它的結構?」

「是的!」他的眼睛亮了起來,「那麼我們不必定義任何其他的結構或任何其他的混亂!「

我想知道這是某種測試。」你會怎麼做報告? 這豈不是尷尬?「

‘我們能做到這一點從前端。’

‘也許,’我說,」但不會是需要大量的代碼?而這將會是 慢得令人難以置信。」

‘若我們使用哈希表!’

‘好吧......怎麼樣的數據完整性,外鍵,諸如此類的事情?’

他越來越防守,「它將全部來自前端」。

「我想,但這將需要大量的代碼 與各種複雜的SQL查詢。這並不是說不好改變 數據庫,如果你 - 「

‘不,’他打斷了,‘我們會用一個數據訪問層,它抽象 歸一化數據結構。’

」你的意思。 ..「

兩天後,我的招聘人員告訴我,他們拒絕了我作爲 的候選人,因爲我沒有足夠的技術,雖然我不知道他們是否實施過他們的元數據庫實施,很高興 我永遠不會知道。

http://thedailywtf.com/Articles/Three-for-Three,-Recursion-Threads,-and-Wrong-Answer.aspx

+0

我明白了你的觀點,但是你的故事使得兩個假設不成立。用戶不會輸入任何數據到這些表中。不會有任何外鍵或其他連接,並且肯定不會有報告和類似的東西。這些表格中的數據絕不會以任何方式出現在屏幕上。請考慮這一點,重新考慮並給我提供一個真正有用的答案。 – Jasper

+0

我明白這一點。這只是爲了說明元數據庫絕不是答案。你應該通過@馬克的評論。 –

2

看一看錶syscolumns和相關的。這看起來很像你所描述的。但是,經過多年的努力,Sybase和微軟提出了一種可能比您想得到的更高效的方式。

要在報表中爲每個不同的一組列使用此功能創建一個新表導入數據 - 數據庫將爲您管理訪問。你在這些表上沒有評論 - 但是你在哪裏將信息保存在模式中 - 如果你有這些數據,那麼就很容易在這些SQL表上創建索引。

1

我不知道你的所有需求,但如果你只是有額外的動態字段,你可能想看看SQL Server中的XML數據類型:Implementing XML in SQL Server。這將允許您針對XML數據類型編寫SQL查詢。

順便說一句,你所建議的不是完全瘋狂的想法。有許多着名的文檔管理系統使用非常類似的動態模式實現。要查詢數據,您需要構建一個相當複雜的查詢。在你的情況下,你只需通過記錄ID對記錄進行分組,並且可以給你所有的記錄列。

在您繼續實施其中的任何一項之前,請考慮是否有可能使用靜態架構來實現此目標。這會讓你的生活更輕鬆(在實現時尤其是在調試應用程序時)。請看Class Table InheritanceConcrete Table Inheritance(這些是可以在設計時使用「繼承」擴展的靜態模式)。

相關問題