2011-06-23 143 views
2
劃定數據

是數據庫領域的東西,將是確定做劃定的數據?在數據庫領域OK

喜歡的東西

create table column_names (
    id int identity (1,1) PRIMARY KEY, 
    column_name varchar(5000) 
); 

,然後存儲它的數據如下

INSERT INTO column_names (column_name) VALUES ('stocknum|name|price'); 
+1

no ...使用枚舉,配對值...等分隔符以外的文本 – ajreal

+1

不,這很糟糕。使用多對多結構。 – BlackICE

+1

我不會。使用結構化的東西例如'create table column_names(id int identity(1,1)PRIMARY KEY,column_name varchar(50)not null,column_order int not null);' –

回答

8

號這是不好:

  • ,以創造,你必須新的查詢追蹤事物的存儲方式。價格或名稱或stocknum是加入

  • 查詢將是討厭

  • 數據庫不能指定數據類型數據或驗證它

  • 你不能創建約束此類數據現在

基本上你顛覆處理的事情,使你自己的RDBMS」計劃,所以你限制RDBMS工具多少可以幫助您和您所做的系統更難o瞭解新人。

這種系統,我能想到的唯一可能的優勢在於,它可以作爲一種變通方法,以避免處理完全不可能的DBA,無論功績誰否決所有架構更改。不幸的是,這可能發生。

當然有一個例外的一切。我目前正在進行審計日誌記錄要求非常嚴格的項目。日誌記錄完成到一個數據庫,我們使用分隔的字段來存儲字段,因爲應用程序永遠不會與這些數據交互,它會被寫入一次,並保持獨立。

+0

同意OP的想法幾乎是你存儲數據的最糟糕的方式。 – HLGEM

+1

@HLGEM:我看到更糟糕的是,在使用XML而不是管道分隔符的varchar(2000)列中。 * _ < –

4

幾乎肯定不會。

  1. 這違反了規範化的原則。存儲在特定列的特定行中的數據應該是原子的 - 您不應該能夠將數據解析爲更小的組成部分。
  2. 這使得它實質上更難以得到可接受的性能。查詢此表的每一段代碼都需要知道如何解析數據,這通常意味着需要從磁盤讀取更多數據,並可能通過網絡將數據發送到客戶端。每個必須解析這些數據的查詢都必須更加複雜,這往往會導致查詢優化器的悲哀。連接數據通常不能有效地進行搜索索引 - 您必須使用自定義分隔符來完成類似全文索引的操作,而不是字符串上的標準索引。如果您必須更新其中一個分隔值(即產品名稱發生更改),那麼這些更新將不得不掃描表中的每一行,解析數據,決定是否實際更新行,然後更新一噸行。
  3. 它使應用程序變得更加脆弱。當有人決定包含|時會發生什麼?例如,name屬性中的字符?即使您在規範中指定了可選的機箱(即,如果整個標記用雙引號括起來,允許|),實際解析此列的代碼中的哪一部分要實現並正確測試?
+0

*原子*並不完全代表「你不應該能夠將數據解析成更小的組成部分」。這意味着,如果一個值*包含*組成部分,那麼dbms或者a)忽略這一事實,就像它在'SELECT CURRENT_DATE'時所做的那樣,或者b)提供了操作這些部分的函數,如'SELECT EXTRACT(YEAR FROM CURRENT_DATE )'。 * dbms意義上* atomic *的重要之處在於*用戶*不必編寫任何代碼來操作這些部件。無論如何。 –