Это хорошая практика, чтобы также сделать отношения между левой и очень правой таблицей непосредственно в MYSQL? - PullRequest
0 голосов
/ 01 мая 2019

Ниже показано, как выглядит моя реляционная база данных в MySQL:

[House]
id
street_id

[Street]
id
city_id
name

[City]
id
province_id
name

[Province]
id
name

С этой структурой, когда у меня есть идентификатор дома, я могу получить название провинции в реляционной цепочке, следуя 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?

1 Ответ

1 голос
/ 01 мая 2019

Рекомендуется ли также напрямую связывать таблицу House с таблицей Province [путем дублирования столбца]

Нет.Это плохая практика, которая возникла в первые дни SQL, когда он очень медленно индексировал / объединял подобные цепочки.

Я не вижу здесь ничего такого, что могло бы быть предметом мнения.Вы будете дублировать информацию как в таблице House, так и в цепочке до Province.Вы получите обновление аномалий .

Именно поэтому мы нормализуем схемы, избегая этих аномалий.

Если многие ваши запросы будут следовать этой цепочке, то лучше создать представление, объединяющее эти таблицы.Возможно, вы могли бы сделать это «материализованным представлением» .Это сложный процесс балансировки оптимизации: запросы должны выполняться быстрее, обновления в любой из базовых таблиц будут выполняться медленнее.

...