Какие идентификаторы из базы данных использовать? - PullRequest
0 голосов
/ 21 июля 2011

У меня есть две таблицы SQL, A и B. Каждая таблица имеет идентификатор первичного ключа. Таблица B имеет поле X (которое может быть NULL), которое ссылается на идентификатор A (если оно не равно NULL).

Тогда мне нужен список (хранящийся в файле) идентификаторов объектов, хранящихся в таблице A.

Какие идентификаторы вы предлагаете использовать, A.ID или B.ID в списке? (Понятно, что имея идентификатор строки в B, мы можем вывести идентификатор строки в A, при условии, что эта строка в B имеет ненулевой X.)

[ДОБАВЛЕНО] Понятно: объект частично хранится в A и частично в B.

[ДОБАВЛЕНО] Структура таблиц (z_users - B, z_clients - A, z_users.client - поле X):

CREATE TABLE `z_users` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `password` varchar(255) collate utf8_bin NOT NULL,
  `fullname` varchar(255) collate utf8_bin NOT NULL,
  `phone` varchar(255) collate utf8_bin NOT NULL,
  `address` text collate utf8_bin NOT NULL,
  `email` varchar(255) collate utf8_bin default NULL,
  `admin` enum('false','true') collate utf8_bin NOT NULL default 'false',
  `worker` int(10) unsigned default NULL,
  `client` int(10) unsigned default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `worker` (`worker`),
  UNIQUE KEY `client` (`client`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `z_clients` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `company` text collate utf8_bin NOT NULL,
  `shortdesc` text collate utf8_bin NOT NULL,
  `site` varchar(255) collate utf8_bin NOT NULL,
  `affair` varchar(255) collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Ответы [ 3 ]

1 голос
/ 21 июля 2011

Используйте бизнес-ключ (натуральный ключ) вашего стола. Обычно неразумно сохранять суррогатный ключ вне базы данных, поскольку он создает скрытую зависимость - если суррогатный ключ подвергается рефакторингу или его значения изменяются, то данные за пределами базы данных становятся недействительными или ссылаются на неправильное значение.

Кажется, что каждая из ваших таблиц имеет только один ключ, и мне не ясно, какими должны быть бизнес-ключи в этом случае.

0 голосов
/ 21 июля 2011

Вы используете набор, который имеет смысл для бизнес-решения, которое вы решаете.

  1. Вы можете выбрать все A независимо от того, есть ли B
  2. Вы можете выбрать все B независимо от того, есть ли A
  3. Вы можете выбрать все A, только если есть соответствующий B
  4. Вы можете выбрать все B, только если есть соответствующий A
  5. вы можете выбрать любой из них с дополнительными условиями других атрибутов
0 голосов
/ 21 июля 2011

Если объект хранится в таблице A, единственной логической вещью является использование идентификатора таблицы A.

В ответ на ваши изменения:

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

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