直接在 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;
在某些情况下,我不需要Street
和City
table中的数据。我只需要知道房子在哪个Province
。像下面这样将 House
table 直接与 Province
table 连接也是一种好习惯吗?
[House]
id
street_id
province_id
通过这样做,我可以直接获取省份,而无需像下面这样与 street
和 city
链接。
$house = House::where(['id' => 1])->with('province')->firstOrFail();
$province = $house->province;
这样做是一个好习惯还是因为 House
已经被 Street
和 street_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 的更新会更慢。
下面是我在 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;
在某些情况下,我不需要Street
和City
table中的数据。我只需要知道房子在哪个Province
。像下面这样将 House
table 直接与 Province
table 连接也是一种好习惯吗?
[House]
id
street_id
province_id
通过这样做,我可以直接获取省份,而无需像下面这样与 street
和 city
链接。
$house = House::where(['id' => 1])->with('province')->firstOrFail();
$province = $house->province;
这样做是一个好习惯还是因为 House
已经被 Street
和 street_id
连接而过度杀戮?
Is it a good practice to also connect the
House
table directly with theProvince
table [by duplicating a column]
没有。这是在 SQL 早期发展起来的一种不好的做法,当时它在 indexing/joining 这样的链上真的很慢。
我在这里没有看到任何意见问题。您将在 House
table 和到 Province
的链中复制信息。你会得到update anomalies。
避免这些异常是我们规范化模式的原因。
如果您的许多查询都将遵循该链,更好的办法是创建一个将这些 table 连接在一起的视图。可能您可以将其设为 'materialised view'。这是一个棘手的优化平衡行为:查询应该更快,对任何基础 table 的更新会更慢。