2010-05-29 66 views
0

我正在創建一個允許用戶創建輸入模式的數據輸入應用程序。動態數據輸入值存儲

我的第一個版本只是爲每個條目模式創建了一個表,每個條目跨越單個或多個列(對於複雜類型)具有適當的數據類型。這允許「快速」查詢(對於小數據集,因爲我沒有對所有列進行索引)以及簡單同步,其中數據條目分佈在多個數據庫上。

雖然我對此解決方案並不滿意,唯一有利的就是簡單... 我只能存儲固定數量的列。我需要在所有列上創建索引。我需要在模式更改上重新創建表。

我的一些關鍵設計審覈規定是:

  • 非常快速的查詢(使用簡單的領域特定的查詢語言)
  • 寫操作並不一定要快
  • 許多併發用戶
  • 模式將經常變化
  • 模式可能包含數千列
  • 數據條目可能分佈且ne編輯syncronization。
  • 優先考慮的MySQL和SQLite-- DB2和Oracle等數據庫不存在問題。
  • 使用.NET /單聲道

我一直在思考了幾個可能的設計,但他們都不似乎是一個不錯的選擇。

解決方案1:聯合表,包含Type列和每個類型一個可爲空的列。

這可以避免連接,但會明確地使用很多空間。

解決方案2:鍵/值存儲。所有值都以字符串形式存儲並在需要時進行轉換。

也使用了很多空間,當然,我討厭不得不將所有東西都轉換爲字符串。

解決方案3:使用xml數據庫或將值存儲爲xml。

沒有任何經驗,我會覺得這很慢(至少對於關係模型,除非有一些非常好的xpath支持)。 我也想避免一個xml數據庫,因爲應用程序的其他部分更適合作爲關係模型,並且能夠加入數據很有幫助。

我不禁認爲有人已經解決了(一些),但我無法找到任何東西。不知道要搜索什麼...

我知道市場調研公司正在爲他們的調查問卷做這樣的事情,但是很少有開放源代碼實施,而我發現的實際上並不完全符合法案。

PSPP有很多我想到的邏輯;原始列類型,許多列,許多行,快速查詢和合並。太糟糕了,它不適用於數據庫..當然...我不需要99%的提供的功能,但很多東西沒有包括在內。

我不確定這是否是正確的地方去問這樣一個設計相關的問題,但我希望這裏有人有一些提示,知道任何現有的工作,或者可以指點我一個更好的地方來問這樣一個問題。

提前致謝!

+0

http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/ 靈活性成本太高,無法正常工作。您需要的大多數數據可以在沒有靈活性功能的情況下進行定義。只能非常謹慎地使用Key/Value存儲,不要將其作爲設計的基礎。沒有人願意像他們所說的那樣靈活性,如果它干擾性能和數據完整性(而且會),那麼他們就不需要它。如果它使用戶界面更難使用(它會),那麼他們討厭使用該應用程序。 每個客戶實際上可能只有3或4件他們需要定製的東西。 – HLGEM 2010-06-25 21:06:05

回答

0

您是否已經考慮過最簡單的解決方案:爲每個數據類型都有一個表,並將數據集的模式存儲在數據庫中。最簡單的辦法:

DATASET Table (Virtual "table") 
ID - primary key 
Name - Name for the dataset/table 

COLUMNSCHEMA Table (specifies the columns for one "dataset") 
DATASETID - int (reference to Dataset-table) 
COLID - smallint (unique # of the column) 
Name - varchar 
DataType - ("varchar", "int", whatever) 

Row Table 
DATASETID 
ID - Unique id for the "row" 

ColumnData Table (one for each datatype) 
ROWID - int (reference to Row-table) 
COLID - smallint 
DATA - (varchar/int/whatever) 

要查詢的數據集(虛擬表),則必須動態構造使用COLUMNSCHEMA表的架構信息的SQL語句。