mysql - 在 SQL 中存储分区集列表的有效方法

标签 mysql sql database database-design database-schema

我有一个事物列表,每个事物都有多个名称(称为 N)和多个属性 (A)。一个例子是带有昵称的宠物列表:

{ Charles } <-> { goldfish }
{ Fluffy, Mr. Fluffs, Señor Fluffs} <-> { gato, cat, chat, feline }
{ Fido, Buster } <-> {dog, Labrador mix, mutt, brown-haired, chien}

我可能有很多这些,其中大多数可能只有 N 和 A 中的一两个条目,但原则上可能有大量条目。我还需要存储每条记录的少量数据,例如每只宠物的年龄及其出生地。

我需要按顺序检索每个事物,并轻松访问该事物的每组数据。

您能否提出一种构建我的数据库表的战略方法?用逗号分隔值的两个字段很诱人,但我肯定可以做得更好,对吗?我有点卡住了。

提前致谢,

马克·C

最佳答案

您需要一个由三个表组成的规范化数据库:一个用于宠物,一个包含名称,一个包含属性。在 MySQL 中:

create table pet (
    id int primary key,
    dateOfBirth date,
    placeOfBirth varchar(50)
);

create table name (
    id int references pet (id),
    name varchar(50),
    primary key (id , name)
);

create table attribute (
    id int references pet (id),
    attribute varchar(50),
    primary key (id , attribute)
);

insert into pet (id) values (1);
insert into pet (id) values (2);
insert into pet (id) values (3);

insert into name (id,name) values (1,'Charles');
insert into name (id,name) values (2,'Fluffy');
insert into name (id,name) values (2,'Mr. Fluffs');
insert into name (id,name) values (2,'Señor Fluffs');
insert into name (id,name) values (3,'Fido');
insert into name (id,name) values (3,'Buster');

insert into attribute (id,attribute) values (1,'goldfish');
insert into attribute (id,attribute) values (2,'gato');
insert into attribute (id,attribute) values (2,'cat');
insert into attribute (id,attribute) values (2,'chat');
insert into attribute (id,attribute) values (2,'feline');
insert into attribute (id,attribute) values (3,'dog');
insert into attribute (id,attribute) values (3,'Labrador mix');
insert into attribute (id,attribute) values (3,'mutt');
insert into attribute (id,attribute) values (3,'brown-haired');
insert into attribute (id,attribute) values (3,'chien');

如果您想要聚合,您可以查询这些表,如下所示:

select 
    group_concat(distinct name
        order by name),
    group_concat(distinct attribute
        order by attribute)
from
    pet
        inner join
    name USING (id)
        inner join
    attribute USING (id)
group by id;

关于mysql - 在 SQL 中存储分区集列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29648256/

相关文章:

sql - 表类型存储在 sql server 中的什么位置?我们如何改变它?

SQL 服务器 : Update reporting table in real time

java - 如何减小 TDB 支持的 Jena 数据集的大小?

MySQL 将 2 个查询连接到同一个表

mysql - Mysql是否有set语句 "in"

php - 使用 mysql password() 函数从 mysqli_query 转换为 php 中的准备语句

php - 我的php和mysql程序有问题吗?

Java Hibernate HQL SQL INNER JOIN 查询不起作用 - Oracle

sql - ADO Connection.Execute 不断返回关闭的记录集

ruby-on-rails - 为 rails 中的所有记录批量缩减一个字段