下面是我在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
表中的数据。我只需要知道房子在哪Province
中即可。还是将House
表直接与Province
表连接,如下所示吗?
[House]
id
street_id
province_id
这样做,我可以直接获得省份,而无需与street
和city
进行如下链接。
$house = House::where(['id' => 1])->with('province')->firstOrFail();
$province = $house->province;
这样做是好习惯还是因为House
已被Street
连接到street_id
而过分杀伤?
答案 0 :(得分:1)
将
House
表直接与Province
表连接也是一种好习惯[通过复制列]
不。这是一种不好的做法,这种做法在SQL的早期就已经出现,当时它在索引/联接这样的链上真的很慢。
我这里没有看到任何见解。您将同时在House
表和到Province
的链中复制信息。您将得到update anomalies。
避免这些异常是我们规范化架构的原因。
如果您的许多查询都将遵循该链,一个更好的主意是创建一个将这些表连接在一起的视图。您可能将其设为'materialised view'。这是一个棘手的优化平衡行为:查询应该更快,对任何基表的更新都将更慢。