如何在MySQL中存储键值对?

How to store key value pairs in MySQL?

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

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

所以我想像这样将这些数据结构存储在 table 中: (只是从 Internet 复制粘贴而不是工作代码)

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)
)

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

第二个table,我推荐:

  • 添加显式自动递增主键。
  • 声明 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 约束中排除该值。

我经常警告 EAV(实体-属性-值)的危害,但我并没有说它是 EVIL。 它只是根本上不是关系的,所以使用一种语言像 SQL 那样被设计用来存储和查询关系数据总是很笨拙和低效。

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

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

MySQL 提供了 JSON data type,因此您有一种混合模式,您可以在其中使用具有 SQL 数据类型的常规列作为您始终需要的属性,然后 JSON 用于动态属性。