我是数据库的新手,尤其是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
?
答案 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来获取动态属性。