LINUX.ORG.RU

помогите со структурой таблицы mysql


0

1

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

★★

индексировать по каким полям будешь? Наверное по городу, то что в некоторых странах чего то там нет, пофиг, пусть будет null. Может я не понял проблемы?

splinter ★★★★★
()
Ответ на: комментарий от splinter

есть 4 таблицы... нет, пусть будет 3 - без региона (Европа, СНГ) К примеру Россия (страна) -> Московская обл (обл) -> Москва (город). В странах которых нет штата/обл будет так: Азербайджан (страна) -> !области нет! -> Баку (город)

ex3me ★★
() автор топика
Ответ на: комментарий от ex3me

три таблицы - город, область, страна. Две таблицы линкованные - город -страна, область-страна. Надеюсь стран в которых есть два одинаковых города нету :-)

splinter ★★★★★
()

>сделать 4 таблицы
извращенец
всё в одной можно хранить
гугли древовидные структуры mysql

TERRANZ ★★★★
()
Ответ на: комментарий от splinter

или область-город? :-) чо то я сам запутался.

splinter ★★★★★
()
Ответ на: комментарий от TERRANZ

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

На счет извращения... Я иду в правильном направлении. Если мне нужно выбрать страны, зачем лопатить всю таблицу ради 10 стран?

ex3me ★★
() автор топика
Ответ на: комментарий от ex3me

а зачем лопатить? О_о
пусть у нас страны сидят на втором уровне вложенности, на первом регион
select place_name from places where place_level = 2;

TERRANZ ★★★★
()
Ответ на: комментарий от TERRANZ

Я Вас прекрасно понял:) Я в курсе что такое деревья.

Данные таблиц город, обл, город содержат еще множество НЕПОХОЖИХ на друг друга полей.

ex3me ★★
() автор топика
Ответ на: комментарий от ex3me

проще с точки зрения разработки - не нужно выделять стотыщ сущностей-таблиц
достаточно двух - таблица наследования и таблица атрибутов

TERRANZ ★★★★
()
Ответ на: комментарий от ex3me

Запросов. С 4 таблицами у тебя будут джойны, при том 3 джойна, что совсем не хорошо.

xpahos ★★★★★
()

Я бы у города завёл ссылку как на область, так и на страну (у всех городов есть ссылка на страну, для стран с областями - ещё и на область), а консистентность можно поддерживать триггерами.

unC0Rr ★★★★★
()

кто мешает зделать так:

region {
 idregion
 name
}

country{
 idcountry
 fkregion
 name
}


area{
 idarea
 fkcountry
 name;
}

city{
 idcity
 fkcountry
 fkarea
 name
}



visual ★★★
()
Ответ на: комментарий от r_asian
CREATE TABLE IF NOT EXISTS `geoip_city` (
  `id` mediumint(8) unsigned NOT NULL,
  `region_id` smallint(5) unsigned NOT NULL,
  `land_id` smallint(5) unsigned NOT NULL,
  `hid` char(24) CHARACTER SET utf8 NOT NULL,
  `code` char(8) CHARACTER SET utf8 NOT NULL,
  `name_ru` char(64) CHARACTER SET utf8 NOT NULL,
  `name_en` char(64) CHARACTER SET utf8 NOT NULL,
  `lat` float(9,5) NOT NULL,
  `lon` float(9,5) NOT NULL,
  `population` int(11) unsigned NOT NULL,
  `tz_id` smallint(5) unsigned NOT NULL,
  `hash` char(32) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`),
  KEY `region_id` (`region_id`),
  KEY `land_id` (`land_id`),
  KEY `name_ru` (`name_ru`),
  KEY `tz_id` (`tz_id`),
  KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `geoip_land` (
  `id` smallint(5) unsigned NOT NULL,
  `hid` char(24) NOT NULL,
  `code` char(8) NOT NULL,
  `name_ru` char(64) NOT NULL,
  `name_en` char(64) NOT NULL,
  `lat` float(9,5) NOT NULL,
  `lon` float(9,5) NOT NULL,
  `population` int(11) unsigned NOT NULL,
  `hash` char(32) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `code` (`code`),
  KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------


CREATE TABLE IF NOT EXISTS `geoip_region` (
  `id` smallint(5) unsigned NOT NULL,
  `land_id` smallint(5) unsigned NOT NULL,
  `hid` char(24) NOT NULL,
  `code` char(8) NOT NULL,
  `name_ru` char(128) NOT NULL,
  `name_en` char(128) NOT NULL,
  `lat` float(9,5) NOT NULL,
  `lon` float(9,5) NOT NULL,
  `population` int(11) unsigned NOT NULL,
  `tz_id` smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `land_id` (`land_id`),
  KEY `code` (`code`),
  KEY `tz_id` (`tz_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `geoip_tz` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `area_id` int(11) unsigned NOT NULL,
  `name` varchar(32) NOT NULL,
  `utc` float(4,2) NOT NULL,
  `utc_summer` float(4,2) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `tz_region_id` (`area_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=406 ;

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `geoip_tz_area` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `area` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`area`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

Вот так выглядят.

r_asian ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.