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

Is it a good practice to also make relationship between left and very right table directly in 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;

在某些情况下,我不需要StreetCitytable中的数据。我只需要知道房子在哪个Province。像下面这样将 House table 直接与 Province table 连接也是一种好习惯吗?

[House]
id
street_id
province_id

通过这样做,我可以直接获取省份,而无需像下面这样与 streetcity 链接。

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

$province = $house->province;

这样做是一个好习惯还是因为 House 已经被 Streetstreet_id 连接而过度杀戮?

Is it a good practice to also connect the House table directly with the Province table [by duplicating a column]

没有。这是在 SQL 早期发展起来的一种不好的做法,当时它在 indexing/joining 这样的链上真的很慢。

我在这里没有看到任何意见问题。您将在 House table 和到 Province 的链中复制信息。你会得到update anomalies

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

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