Три уровня: Страна,регион,город как реализовать?

назрел такой вопрос, вообщем нужно три уровня страны, как лучше это реализовать с помощью MANY_MANY, страну,регион,город хранить в отдельной таблице или разбросать по разным? как связывать между собой, есть какие решения этого плана?

По разным таблицам. Никаких Many to Many. Первая таблица: страна(id, country). Вторая таблица (id, country_id, region). Третья город( id, region_id, city). Связываешь region и country:




	public function relations()

	{

		return array(

            'country' => array(self::BELONGS_TO, 'Country', 'country_id'),

            ...........................



А потом обращаешься к записям: $model->region. :)

При чем здесь вообще MANY_MANY? Если конечно у вас один город не может быть сразу в нескольких странах (а что, всякое в жизни бывает :D).

В таблицу городов рекомендовал бы добавить и поле country_id, чтобы можно было без региона при надобности обходиться.

спасибо большое, полезная информация, буду побывать, если возникнут какие вопросы обращаюсь

вернулся снова к своему вопросу и появился такой вопрос, сразу не додумался спросить, где хранить ID выбранной допустим страны или города или региона, и как отличить к чему этот ID относиться(страна,регион,город) ?

ранее я делал связь ввиде MANY_MANY где для фильма можно было выбирать несколько жанров, и тут всего одна связь была фильмы с жанрами FilmGenre, а здесь три таблицы, получается нужно для каждой из них нужно создавать промежуточную таблицу?

допустим есть такая таблица назовём её User(id,name) - таблица пользователей, где пользователь должен указать место нахождения, он может указать что-то одно из трёх(страна,регион,город). Или мне нужно в этой же таблице User добавить ещё три столбца тоесть User(id,name,city_id,region_id,country_id) или же создать три промежуточные таблицы UserCity(id,user_id),UserRegion(id,user_id),UserCountry(id,user_id)

что лучше и правильнее, или может есть другой вариант?

Если вы заботитесь о целостности и непротиворечивости данных, то оба вариант не очень хороши. В первом случае никто не запретит city_id присвоить значение 1, а country_id - значение 10, при этом такого города в этой стране не будет существовать. Если разрешить заполнение только одного поля из трех, то слишком много внешних ключей будут NULL’ы, а это не гуд. Второй вариант плох по той же причине. Можно добавить разные записи в разные таблицы.

Еще вопрос: пользователь может быть привязан к нескольким странам/регионам/городам?

мда…

дело в том что я делаю города одним целом, т.к. система будет модульная и для каждого модуля создавать свою базу городов не хотелось т.к. получиться слишком объёмная база, поэтому решил города сделать для всех едино. Только в каждом модуле в зависимости от разных задач эту базу городов будут циплять по разному, ну например для пользователя вообще можно было сделать выбор только страны, а вот в каком-то другом модуле к примеру объявления можно было выбирать города из трёх частей тоесть страна->регион->город, а гдето может потребоваться только страна->регион

пока я вижу для себя первый вариант тоесть где User(id,name,city_id,region_id,country_id)

насчёт того что вы написали что появиться возможность создать путаницу и представить совсем другой город не в соответствующюю страну, тут я думаю всё зависит от интерфейса, пока не представляю как это возможно сделать(имеется введу подставить не верное число)

Насчёт интерфейса, планирую сделать примерно так prodayslona.ru/personal/add_add.php

только здесь выбор разделов, но потому же принципу будут города, тут я думаю уже не подставить не верное значение

Не стоит никогда полагаться на один лишь интерфейс. Тогда уж с "хорошим" интерфейсом таблицы типа InnoDB вообще не нужны, везде можно делать MyISAM (без поддержки транзакций и внешних ключей).

Если у вас такая глобальная система, то с проектированием здесь вряд ли помогут :)

да нет ничего такого замутного я не делаю, вы уж извините может что не так не правильно написал, вроде всё как обычно. Сама связка с городами мне в принципе понятна из второго поста, но не ясно одно, при выборе из третьей таблицы "Города" город, где хранить его индификатор в каком месте, как обычно с этим поступают?

реализовать можно и одной таблицей с полями.

id | name | parent_id

где например id - текущий идентификатор региона

name - понятно его название

parent_id - идентификатор родителя.

например все страны в этой таблице будут иметь parent_id = 0

а например Московская область будет иметь parent_id = идентификатору России

можно еще ввести еще однин столбец n_level где будут хранится уровень вложенности. Страна = 0, облсть / край = 1, город = 2

ну, как вариант )

пысы: единственное в таком случае при огромной вложенности, при построении например дерева, надо будет пользоваться подходом nested

cpt Obvious, эт понятно, этот пример часто применяется для разделов, но в данном случаи он не подходит, т.к. хранить страны, области и города в одной таблице не хотелось, я уже решил что все они будут находиться в отдельных таблицах. А хранить я имел введу, только индификатор(страна,область,город).

Я вообщем пришёл пока только к одному варианту, создать три столбца допустим в той же таблице пользователя User(city_id,region_id,country_id)

но как выше писали появятся много NULL, я думаю это не страшно, хотя тут можно автоматом при добавлении/редактировании записи ставить нулевое значение.