gpt4 book ai didi

mysql - 在 MySQL 中,如何在不将它们添加为列的情况下同时高效地查询两个或多个属性?

转载 作者:可可西里 更新时间:2023-11-01 08:37:08 26 4
gpt4 key购买 nike

假设我有一张人物表和一张与人物相关的属性表。 (不,我不是在构建约会网站,这只是一个很好的例子。)人员表如下所示:

id integer
name varchar(100)

属性表如下所示:

person_id integer
name varchar(100)
value varchar(100)

我可以很容易地获取一个人的所有属性:

SELECT * FROM attribute WHERE person_id = 5;

如果我想找到所有高度超过 60 英寸的人,那也很容易:

SELECT person_id FROM attribute WHERE name = 'height' AND value > 60;

当然,我可以向这些查询添加一个连接以获取此人的姓名。

但是,如果我需要找到高度超过 60 英寸且年龄超过 40 岁的人(请注意此处需要 AND),我想到的最简单的解决方案是(为了便于阅读而缩进):

SELECT p.id FROM person p 
INNER JOIN attribute a1 ON a1.person_id = p.id AND a1.name = 'height' AND a1.value > 60
INNER JOIN attribute a2 ON a2.person_id = p.id AND a2.name = 'age' AND a2.value > 40;

请注意,我两次加入同一张 table 。

我是否错过了无需重复加入即可执行此操作的直接方法,或者这是最有效的方法吗?我可以多次重复连接而不会遇到麻烦吗?

我知道一个假设的替代方案:将个人属性(高度、年龄等)添加为人员表中的列。不幸的是,在我的应用程序中,人们不断地添加新属性(想想 flickr 中的机器标签)。将它们全部添加为列是不可行的,即使我有权即时更改数据库架构。

谢谢!

最佳答案

你所拥有的可能是你将获得的最有效的数据结构。虽然它仍然有点奇怪....除非一个人可以有多个高度或年龄,否则合并这些表格可能更有意义。

如果没有别的,有一个 person 表和 personattribute 表,其中包含一些常用元素作为列而不是行。您仍然可以拥有其他更隐蔽的属性的属性表,您可以与其他对象共享这些属性。

人物属性

  • 个人
  • 高度
  • 年龄
  • 体重
  • 鞋码
  • 腰围
  • someotherbodypart_size

有时存储开销可以被性能提升所抵消。在这种情况下,如果每个“人”都具有这些共同属性,那么您也不会真正浪费太多存储空间。

只是我的 2 美分。

关于mysql - 在 MySQL 中,如何在不将它们添加为列的情况下同时高效地查询两个或多个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com