在MYSQL中直接在左表和右表之间建立关系是一种好习惯吗?

时间:2019-05-01 09:46:20

标签: mysql relational-database

下面是我在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;

在某些情况下,我不需要StreetCity表中的数据。我只需要知道房子在哪Province中即可。还是将House表直接与Province表连接,如下所示吗?

[House]
id
street_id
province_id

这样做,我可以直接获得省份,而无需与streetcity进行如下链接。

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

$province = $house->province;

这样做是好习惯还是因为House已被Street连接到street_id而过分杀伤?

1 个答案:

答案 0 :(得分:1)

  

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

不。这是一种不好的做法,这种做法在SQL的早期就已经出现,当时它在索引/联接这样的链上真的很慢。

我这里没有看到任何见解。您将同时在House表和到Province的链中复制信息。您将得到update anomalies

避免这些异常是我们规范化架构的原因。

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