2012-12-29 61 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可能会有更好的系统,但不太熟悉它。 –