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

在MYSQL中直接建立左表和右表之间的关系是一种好的做法吗?,mysql,relational-database,Mysql,Relational Database,下面是我在MySQL中的关系数据库的外观: [House] id street_id [Street] id city_id name [City] id province_id name [Province] id name 有了这个结构,当我有一个房子的ID时,我可以通过关系链接的方式获得省名,如下所示 $house = House::where(['id' => 1])->with('street.city.province')->firstOrFail();

下面是我在MySQL中的关系数据库的外观:

[House]
id
street_id

[Street]
id
city_id
name

[City]
id
province_id
name

[Province]
id
name
有了这个结构,当我有一个房子的ID时,我可以通过关系链接的方式获得省名,如下所示

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

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

$province = $house->province;
在某些情况下,我不需要
街道
城市
表中的数据。我只需要知道房子在哪个省。将
房屋
表直接连接到
表是否也是一种良好的做法,如下所示

[House]
id
street_id
province_id
通过这样做,我可以直接获得省,而无需与
街道
城市
链接,如下所示

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

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

$province = $house->province;
这样做是一种好的做法还是过度杀戮,因为
房屋
已经通过
街道
通过
街道id
连接起来了

House
表直接连接到
Province
表[通过复制列]是否是一种良好的做法

不,这是一种糟糕的做法,它在SQL的早期发展起来,当时它在索引/连接这样的链方面非常缓慢

我看不出这是一个意见问题。您将同时复制
House
表和
Province
链中的信息。你会得到的

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


如果您的许多查询将遵循该链,那么更好的方法是创建一个将这些表连接在一起的视图。也许你可以做一个。这是一个棘手的优化平衡行为:查询应该更快,对任何基表的更新都会更慢。

如果你这样建模,这个问题主要是基于观点和品味的。。房屋位于县、省和或街道,因此如果您将
省/u id
直接添加到房屋表中以获取我的意见,则该房屋不属于wierd。。由于
矿房位于农村..
矿房位于省内..
等事实是有效的。我想遵循大多数意见,老实说。我想知道同时添加street_id和province_id是一种好的做法还是过度。很难回答,因为我不知道laraval使用该代码生成哪种SQL查询,也不知道像索引这样的表是如何定义的。在没有框架的纯SQL查询中,您会怎么做?显示更新异常是单个表所做的事情,因此您误用了这个术语。您似乎想说,如果没有足够的约束,DBMS将允许错误的更新提供不一致的数据。