Базовый дизайн mysql innodb для компонента Joomla - PullRequest
0 голосов
/ 15 октября 2011

У меня есть четыре объекта:

  • человек
  • центр
  • активность
  • адрес

Итак, моя идея такова:

  • У человека может быть связанный адрес.
  • У центра может быть связанный адрес.
  • Деятельность может иметь связанный адрес.

Правильно ли это оформление mysql для компонента joomla?

CREATE TABLE `#__person` (
`id` int(10) NOT NULL AUTO_INCREMENT,
other fields...
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `#__center` (
`id` int(10) NOT NULL AUTO_INCREMENT,
other fields...
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `#__activity` (
`id` int(10) NOT NULL AUTO_INCREMENT,
other fields...
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `#__address` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`line1` varchar(30),
`line2` varchar(30),
`locality` varchar(10),
`region` varchar(10),
`country` varchar(10),
`postcode` varchar(10),
`person_id` int(10),
`center_id` int(10),
`activity_id` int(10),
PRIMARY KEY (id),
FOREIGN KEY `person_id` REFERENCES `#__person` (id) ON DELETE CASCADE,
FOREIGN KEY `center_id` REFERENCES `#__center` (id) ON DELETE CASCADE,
FOREIGN KEY `activity_id` REFERENCES `#__activity` (id) ON DELETE CASCADE,
other fields...
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

То есть:

  • Если я удалю человека, автоматически будет удален соответствующий ему адрес?
  • А если я удалю адрес, что будет с их ссылками? (ничего не надейся)
  • Что произойдет, если один и тот же адрес является адресом для центра и для деятельности?
  • Находятся ли внешние ключи в правильной таблице или я должен указать поле address_id для личности, центра и вида деятельности?

Я немного запутался в своем дизайне.

Спасибо за ваши предложения.

1 Ответ

0 голосов
/ 16 октября 2011

Вместо того, чтобы помещать идентификатор для человека, центра и активности в таблицу адресов, я бы предложил разместить address_id в каждой из других таблиц (человек, центр и деятельность).Затем вы можете повторно использовать один и тот же адрес в других таблицах и в разных комбинациях персонажа, центра и деятельности.

И касательно каскада, я думаю, справочное руководство по MySQL хорошо объясняет это :

CASCADE: удалить или обновить строку из родительской таблицы и автоматически удалить или обновить соответствующие строки в дочерней таблице.Поддерживаются как ON DELETE CASCADE, так и UPDATE CASCADE.Между двумя таблицами не следует определять несколько предложений ON UPDATE CASCADE, которые действуют на один и тот же столбец в родительской таблице или в дочерней таблице.

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

FOREIGN KEY `address_id` REFERENCES `#__address` (id) ON DELETE CASCADE

, а затем, когда вы удалили строку в таблице адресов (которая БЕЗ ограничения внешнего ключа), соответствующие строки в человеке, центре или деятельности (где внешние ключи определены), будут удалены.НО, я предполагаю, что это может быть не то, что вы хотите, потому что вы сказали, что человек, центр и деятельность «могут» иметь адрес.Поэтому, если вы удалили адрес, вы не обязательно хотите удалить человека, центр или деятельность, которая использовала этот адрес.Если это так, то я бы изменил ограничение внешнего ключа в каждой из 3 таблиц на:

FOREIGN KEY `address_id` REFERENCES `#__address` (id) ON DELETE SET NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...