gpt4 book ai didi

mysql - 一对多模式的非规范化

转载 作者:行者123 更新时间:2023-11-29 14:15:03 25 4
gpt4 key购买 nike

我在 MySQL 中有一个表结构,其中的结构如下:

home_id, home_name, dateadded

我有另一个名为“规范”的表,其结构如下:

home_id, spec_key, spec_value

在其中我可以有如下条目:

1, price, 500000
1, location, 90210
1, rooms, 3
1, washrooms, 3
1, furnished_basement, 0
2, location, 14410
2, garage_size, 3
2, price, 335000

出于搜索目的,我想对上述内容进行非规范化。表 (denormalized_homes) 结构如下所示:

home_id, price, location, rooms, washroom, furnished_basement, garage_size, dateadded

从上面可以看出,a) 并非所有条目的所有列都有值。 b) 表结构不利于INSERT INTOdenormalized_homesselect * fromspecs类型查询。我也无法使用存储过程或触发器(主机规定)。

到目前为止,我采取的策略是将 home_id 插入到 denormalized_homes 表中,然后使用如下查询遍历规范中的每个字段:

UPDATE `denormalized_homes` dh, specs s SET dh.price = s.spec_value WHERE dh.home_id = s.home_id AND s.spec_key = "price";

为每个可能的列创建一个查询,然后运行它们。我只是想一定有更好的方法,是吗?

最佳答案

我认为你可以做这样的事情:

INSERT INTO denormalized_homes ()

SELECT h.home_id,
price.spec_value price,
location.spec_value location,
rooms.spec_value rooms,
washroom.spec_value washroom,
furnished_basement.spec_value furnished_basement,
garage_size.spec_value garage_size,
h.date_added

FROM homes h

LEFT JOIN specs price
ON price.home_id = h.home_id and spec_key = 'price'

LEFT JOIN specs location
ON price.home_id = h.home_id and spec_key = 'location'

LEFT JOIN specs rooms
ON price.home_id = h.home_id and spec_key = 'rooms'

LEFT JOIN specs washroom
ON price.home_id = h.home_id and spec_key = 'washroom'

LEFT JOIN specs furnished_basement
ON price.home_id = h.home_id and spec_key = 'furnished_basement'

LEFT JOIN specs garage_size
ON price.home_id = h.home_id and spec_key = 'garage_size'

关于mysql - 一对多模式的非规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12820348/

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