【问题标题】:Saving paired value in MySQL [closed]在 MySQL 中保存配对值 [关闭]
【发布时间】:2012-12-29 16:13:38
【问题描述】:

例如:

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

mysql 中的一个存储通常的方式是创建一个列名'size'等。但是,由于我关注的对中的第一项是不确定的(比如我希望用户能够输入数据,例如 producer:samsung;或用户想要输入的任何数据对)

有没有办法在 mysql 中优雅地做到这一点?也许是一个常见的分隔字符串?在任何情况下,我都希望这些数据能够轻松输出为表格,并可能进行搜索,例如获取 size=22" 的所有项目。

【问题讨论】:

  • 你想要Entity-Attribute-Value 模型。
  • 这听起来更像是“nosql”的情况。要么你有一个设定的模式(“大小”、“模型”等),要么你只有值。避免将逗号分隔的对放入 sql 列中。它会让你难过。
  • 请更准确一点,我们将不胜感激有文档的示例,我知道您需要为同一列输入多个条目。
  • Hello ethrbunny 我也听说过不要将逗号分隔值放在 mysql 字段中,但在我看来,像 explode() 这样的函数可以很好地处理这个任务。这种方法的主要困难是什么?
  • @user1906418:然后将 json 放入文本字​​段。 Mysql 数据库在某个时间点甚至可能支持它。

标签: php mysql database


【解决方案1】:

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,并为实体名称和任何必填字段设置另一个表。
  • 是一个多字段键表(Entity,Key)

为什么这是最好的方法:

  • 单个字段中的逗号分隔值会破坏数据库的整个要点。

这个属性是第一范式。如果您在一个字段中放置多个值,您将无法使用 SQL 对该字段进行排序(至少不能以相当快的方式)。

您还需要处理解析等问题 - 必须转义更多字符。

  • 在运行时更改表架构和添加新字段也对性能不利。

你最终会得到非常稀疏的表,大量的 NULL 条目。

【讨论】:

  • 非常感谢,这是一个非常有建设性的答案。我不确定我是否正确阅读了您关于“效率低下”的句子。你的意思是如果我必须在 mysql 中执行此操作,这是最好的方法,但还有其他更适合和有效的框架?
  • 是的,基本上。我相信 NoSQL 可能有更好的系统,但不是那么熟悉。
【解决方案2】:
table_name( primary_key, pair_name, pair_value)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2013-06-25
    • 2017-12-02
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多