Выбор значения связи в админке страна, город, метро

StalkerClasses

Новичок
Есть таблицы
Страна
Город (выбирается страна)

И есть Дилер

Есть два варрианта как привязать дилера:

1. Выбрать страну и город (но здесь придётся проверять действительно ли выбранный город принадлежит стране)
2. Выбрать только город

Какой способ лучше?
И если первый то кто как проверяет действительно ли выбранные в дилере страна и город соответствуют отношениям страна-город?

Фактически в первом случае получаются две связи м:1,вторая из которых зависит от первой.
 

WMix

герр M:)ller
Партнер клуба
что есть "привязать"? записать в базу?
SQL:
insert into dealerы set city_id = ? where dealer_id = ?
как проверяет действительно ли выбранные в дилере страна и город соответствуют отношениям страна-город
а ты пиши только город!
 

StalkerClasses

Новичок
Получается что есть связи значение которого затачивается на другую связь.
Посмотрел в Yii есть зависимые dropdown.
Yii Dropdown

Есть ли такое понятие как зависимая связь от значения другой связи в теории БД?
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
а почемуб не прочитать «теорию бд»?
 

StalkerClasses

Новичок
В теории баз данных есть 5 типов связей.
1к1
1кМ
Мк1
МкМ
Полиморфизм

Но здесь получается что одна из связей Мк1 зависит от значения другой Мк1
 

WMix

герр M:)ller
Партнер клуба
В теории баз данных есть 5 типов связей.
1к1
1кМ
Мк1
МкМ
Полиморфизм
какой ужас, как ты еще EAV не прикрутил.
я всегда считал что есть только 1:1 и 1:n остальное это производные
Полиморфизм это либо antipattern либо вообще не о базах

ну да ладно, отвечая на твой вопрос, в SQL есть проверока целосности это constraint и check ограничения.
на mysql врятли что умное напишешь - скромненькая поддержка. но зато есть triggers который может before insert/update
бросить signal и прекратить изменения
 

StalkerClasses

Новичок
Это разные станции. У вас в каждой станции может быть поле фотография. Соответственно это две разных пушкинских.
 

StalkerClasses

Новичок
какой ужас, как ты еще EAV не прикрутил.
я всегда считал что есть только 1:1 и 1:n остальное это производные
Полиморфизм это либо antipattern либо вообще не о базах

ну да ладно, отвечая на твой вопрос, в SQL есть проверока целосности это constraint и check ограничения.
на mysql врятли что умное напишешь - скромненькая поддержка. но зато есть triggers который может before insert/update
бросить signal и прекратить изменения
Про 1:1 и 1:n согласен.
Но вот есть вопрос. Обычно для связей many many создаётся дополнительная таблица.

Я сделал 1 таблицу sys_mm. В ней я храню все many many записи.
У меня в ней идут поля:
id
table
field
id_record_1
id_record_2

Я могу здесь как-то использовать тот же принцип 1:n?
 

WMix

герр M:)ller
Партнер клуба
m:n это 3 таблицы t1, t2 и связующая t12.
соответственно
t1 - 1:n - t12 и
t2 - 1:n - t12
отсюда t1 - m:n - t2
а что у тебя предстоить понять

У меня в ней идут поля:
id
table
field
id_record_1
id_record_2
 
Последнее редактирование:

StalkerClasses

Новичок
Да у меня 3 таблицы.
Но в этой самой 3 таблице у меня хранятся все связи many many.
 

WMix

герр M:)ller
Партнер клуба
у тебя polymorphic-association сделай нормально базу, или решай свои задачи сам (в таком виде даже 1:n проверка не работает)
 

StalkerClasses

Новичок
Получается что есть связи значение которого затачивается на другую связь.
Посмотрел в Yii есть зависимые dropdown.
Yii Dropdown

Есть ли такое понятие как зависимая связь от значения другой связи в теории БД?
И всетаки хотелось бы изначально к этому вопросу вернуться.
 

WMix

герр M:)ller
Партнер клуба
ну да ладно, отвечая на твой вопрос, в SQL есть проверока целосности это constraint и check ограничения.
на mysql врятли что умное напишешь - скромненькая поддержка. но зато есть triggers который может before insert/update
бросить signal и прекратить изменения
 

fixxxer

К.О.
Партнер клуба
Давай рассуждать логически.

Нормальные формы требуют не дублировать данные, которые уже есть в базе.
Дилер всегда в каком-то городе, а город всегда в какой-то стране, потому достаточно у дилера хранить city_id.

Что касается метро.
Это дополнительная информация. Дилер может не относиться ни к какой станции метро (не во всех городах есть метро), а может быть вообще на нескольких сразу (скажем, одинаково близко, ну или штуки типа московских Пушкинской-Чеховской или питерских Маяковская-Площадь восстания, которые по сути одна и та же станция). Потому тут имеет смысл отдельно сделать таблицу dealer_metro_stations (dealer_id, metro_station_id) UNIQUE (dealer_id, metro_station_id). (Можно этот UNIQUE сделать PK, а можно добавить суррогатный PK - это уже деталь реализации, тут есть "за" и "против" каждого варианта).

Полагаю, тебя все же беспокоит вариант, что делать, если бы в примере с метро станция была строго одна или ноль. В этом случае у дилера делаешь city_id и metro_station_id, но заполняешь только одно, более частное (если есть metro_station_id, то city_id NULL), и джойнишь по обоим, в итоге получишь искомое. В нормальной СУБД можно добавить check constraint, который не даст сделать оба NOT NULL, в mysql предлагаю страдать.

Код:
select
  d.id as dealer_id,
  d.name as dealer_name,
  m.id as metro_station_id,
  m.name as metro_station_name,
  coalesce(c1.id, c2.id) as city_id,
  coalesce(c1.name, c2.name) as city_name,
  c.id as country_id,
  c.name as country_name
from dealers d
left join cities c1 on (c1.id = d.city_id)
left join metro_stations m on (m.id = d.metro_station_id)
left join cities c2 on (c2.id = metro_stations.city_id)
inner join countries c on (c.id = coalesce(c1.country_id, c2.country_id))
Никакого полиморфизма, никакого абстракционизма, сохраняет стены от сырости, вас от ревматизма.

На вопрос "как это сделать в Yii" я не отвечу, не знаю и знать не хочу. Но предположу, что самым обычным образом, как и во всех других случаях.
 
Последнее редактирование:
Сверху