Каково идеальное решение для хранения нескольких идентификаторов в таблице базы данных? - PullRequest
1 голос
/ 03 февраля 2011

В моем приложении по недвижимости есть таблица базы данных, в которой хранятся запросы (запросы) пользователя. Эта таблица содержит всю информацию о конкретном запросе недвижимости.

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

CREATE TABLE IF NOT EXISTS `queries` (
  `id` bigint(20) NOT NULL auto_increment,
  `category_id` int(10) NOT NULL,
  `serial` varchar(30) NOT NULL,
  `minBudget` int(11) NOT NULL,
  `maxBudget` int(11) NOT NULL,
  `city_id` int(10) NOT NULL,
  `area_id` int(10) NOT NULL,
  `locality` varchar(100) NOT NULL,
  `status` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

В city_id и area_id есть вероятность, что я захочу сохранить несколько идентификаторов; например, 10, 12, 20, 50 и так далее.

Как мне хранить это в базах данных?

Должен ли я использовать тип данных varchar и держать его как строку с определенным разделителем , а затем извлечь значение в массив?

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

Вы можете сделать это, но это не совсем предпочтительное решение.Это классический компромисс в нормализации базы данных.

«Более правильный» подход состоит в том, чтобы иметь таблицы «города» и «области», а также таблицы «query_cities» и «query_areas», которые являются многими для многих.связать их.

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

1 голос
/ 03 февраля 2011

НЕ используйте varchar, если это идентификаторы для другой таблицы. Используйте таблицу «многие ко многим», отображая их вместе.

CREATE TABLE IF NOT EXIST `query_cities` (
 `id` bigint(20) NOT NULL auto_increment,
 `query_id` bigint(20),
 `city_id` bigint(20)
)

CREATE TABLE IF NOT EXIST `query_areas` (
 `id` bigint(20) NOT NULL auto_increment,
 `area_id` bigint(20)
)

Это будет намного чище, чем вставлять вещи в varchar - например, он позволяет вам сказать:

SELECT c.city_name, c.state, c.whatever FROM queries q 
JOIN cities c ON (q.city_id = c.id) WHERE q.id = ?

Редактировать: ме, я хромая и не включала внешние ключи, но вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...