如何在MySQL中存储键值对?

时间:2017-07-15 16:08:02

标签: mysql sql entity-attribute-value

我是数据库的新手,尤其是MySQL。假设我需要在MySQL中存储平面键值数据结构。每个数据结构都有一些必需的字段和许多可预先知道的可选字段,并且可能经常更改。

我需要通过其中一个必填字段检索所有数据结构,并可能删除它们。

所以我想将这些数据结构存储在这样的表中: (只是来自互联网的复制粘贴而不是工作代码)

CREATE TABLE my_data_structures (
   my_data_structure_id INT     NOT NULL,
   my_required_field1   VARCHAR NOT NULL,
   my_required_field2   INT     NOT NULL,
   PRIMARY KEY (my_data_structure_id)
)

CREATE TABLE my_optional_fields (
   my_optional_field_name  VARCHAR  NOT NULL,
   my_optional_field_value VARCHAR  NOT NULL,
   FOREIGN KEY (my_data_structure_id) REFERENCES my_data_structures(my_data_structure_id)
)

这种方法有意义吗?如何为第二个表定义primary key

2 个答案:

答案 0 :(得分:1)

对于第二张表,我建议:

  • 添加显式自动递增主键。
  • 声明varchar
  • 的长度
  • 声明my_data_structure_id
  • 有一个unique约束

结果如下:

CREATE TABLE my_optional_fields (
   my_optional_fields_id int auto_increment primary key,
   my_data_structure_id int not null,
   my_optional_field_name VARCHAR(255)  NOT NULL,
   my_optional_field_value VARCHAR(255)  NOT NULL,
   FOREIGN KEY (my_data_structure_id) REFERENCES my_data_structures(my_data_structure_id)
   UNIQUE (my_data_structure_id, my_optional_field_name, my_optional_field_value)
);

我猜这个唯一约束就在这对上。但是,如果您只想要一个给定名称的字段,请从unique约束中排除该值。

答案 1 :(得分:1)

我经常警告EAV的危害,但我并不是说它是 EVIL。它基本上不是关系型的,所以使用像SQL这样的语言来存储和查询关系数据是总是会变得尴尬和低效。

如果没有其他选择,请使用EAV,但要警告您在使用EAV时有义务做更多的工作。您的查询将更复杂,您将失去数据库服务器强制执行约束的能力,等等​​。

另一种方法是使用某种类型的非关系数据库,如文档存储,因此您可以根据需要插入一组用户定义的字段。

MySQL提供了JSON data type,所以你有一种混合模式,你可以使用常规列和SQL数据类型来获取你总是需要的属性,然后使用JSON来获取动态属性。