首页 > 解决方案 > 直接在 MYSQL 中建立左表和右表之间的关系是一种好习惯吗?

问题描述

下面是我在 MySQL 中的关系数据库的样子:

[House]
id
street_id

[Street]
id
city_id
name

[City]
id
province_id
name

[Province]
id
name

有了这个结构,当我有一个房子的 ID 时,我可以按照 Laravel Eloquent 的关系链接方式获取省份名称,如下所示。

$house = House::where(['id' => 1])->with('street.city.province')->firstOrFail();

$province = $house->street->city->province;

在某些情况下,我不需要StreetandCity表中的数据。我只需要知道Province房子在哪里。House将表直接与表连接如下是一种好习惯Province吗?

[House]
id
street_id
province_id

通过这样做,我可以直接获得省,而无需链接streetcity如下。

$house = House::where(['id' => 1])->with('province')->firstOrFail();

$province = $house->province;

House这样做是一种好习惯,还是因为已经被Streetby连接而过度杀戮street_id

标签: mysqlrelational-database

解决方案


House将表直接与表连接是否也是一种好习惯Province[通过复制列]

不,这是一种不好的做法,在 SQL 的早期发展起来,当时它在索引/加入这样的链时非常慢。

我在这里看不到任何意见问题。House您会将表和链中的信息复制到Province. 你会得到更新异常

避免这些异常是我们标准化模式的原因。

如果您的许多查询都将遵循该链,则更好的主意是创建一个将这些表连接在一起的视图。您可能会将其设为“物化视图”。这是一个棘手的优化平衡行为:查询应该更快,对任何基表的更新都会更慢。


推荐阅读