2012-12-29 60 views
-4

配對值例如:保存在MySQL

An item 
{ 
size:23" 
Resolution:1920*1080 
Panel:IPS 
} 
(as in an usual table) 

通常的方法在MySQL一個商店將作出的列名「尺寸」等。但是,由於我擔心的第一個項目是不確定的(比如我希望用戶能夠輸入生產者的數據:三星;或者任何用戶想要輸入的數據對)

有沒有在mysql中優雅地做到這一點?也許一個普通的分隔字符串在任何情況下,我想這些數據作爲表輕鬆輸出,和潛在的做像大小= 22" 讓所有商品檢索

+2

您想要[Entity-Attribute-Value](http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)模型。 – eggyal

+0

這聽起來更像是'nosql'情況。要麼你有一套模式(「大小」,「模型」等),或者你只是有價值觀。避免將逗號分隔的對放入sql列。它會讓你傷心。 – ethrbunny

+0

請更精確地說,一個記錄的例子將不勝感激,我知道你需要爲同一列有多個條目。 –

回答

1
table_name(primary_key, pair_name, pair_value) 

select * 
from table_name 
where (pair_name = 'size' and pair_value = '22') 
and primary_key = ........ 
2

MySQL的解決方案

Entity Key  Value 
An item size  23" 
An item Resolution 1920*1080 
An item Panel  IPS 

SELECT * FROM table where Entity = 'An item'; //Selecting info on an item 

SELECT * FROM table where Entity IN //Selecting info on items with size = '22"' 
    (SELECT Entity WHERE Key = 'size' AND Value = '22"'); 

點評:

  • 所有數據被存儲爲字符串,DB類型檢查的損失和低效
  • 很多應用邏輯和子查詢。
  • 您可以使實體成爲一個ID併爲實體名稱和任何必填字段提供另一個表。
  • 這是一個多領域的主要表(實體,密鑰)

爲什麼這是最好的辦法:

  • 逗號分隔的一個字段中的值突破的數據庫整點。

此屬性是第一範式。如果您在一個字段中放置多個值,您將無法使用SQL對字段進行排序(至少不能以相當快的方式進行排序)。

您還有類似解析的問題需要解決 - 必須轉義的更多字符。

  • 在運行時更改表模式和添加新字段對性能也不利。

你會得到非常稀疏的表格,大量的NULL條目。

+0

非常感謝這是一個非常有建設性的答案。我不確定我是否正確閱讀了「低效率」的句子。你的意思是,如果我必須在MySQL中這樣做,這是最好的方式,但是還有其他更合適和有效的框架嗎? – user1906418

+0

是的,基本上。我相信NoSQL可能會有更好的系統,但不太熟悉它。 –