Дизайн БД для хранения сложных атрибутов - PullRequest
0 голосов
/ 22 июля 2010

Я разрабатываю веб-приложение на PHP, которое обрабатывает информацию об определенных компаниях. Пока что дизайн БД выглядит так:

CREATE TABLE `group` (
  `group_id` int(10) unsigned NOT NULL auto_increment,
  `group_name` varchar(50) NOT NULL,
  PRIMARY KEY  (`group_id`)
) ENGINE=InnoDB;

CREATE TABLE `company` (
  `company_id` int(10) unsigned NOT NULL auto_increment,
  `company_name` varchar(50) NOT NULL,
  `group_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`company_id`),
  KEY `FK_company_group` (`group_id`),
  CONSTRAINT `FK_company_group` FOREIGN KEY (`group_id`) REFERENCES `group` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

Дизайн слишком упрощен, и мне нужно изменить его, чтобы он мог содержать актуальную информацию о классификации компании. Подводя итог, можно сказать, что компания может находиться в одной (и только в одной) из четырех возможных ситуаций и при необходимости может быть связана с другим объектом (группой или другой компанией); тип и характеристики связанного объекта зависят от ситуации:

                -  Independent           
               /             
              /               
   - Holding /                    
  /          \                 --- Direct -> Group
 /            \               /               
/              \             /               
\               -  Dependent ----- Indirect -> Company of "Direct" type                     
 \                                     
  \                                    
   - Subsidiary -> Company of "Holding" type                                  

Таким образом, компания может быть «независимой», «прямой», «косвенной» или «дочерней». Стрелки представляют собой ссылки. (Извините, если названия не имеют большого смысла, я на лету перевожу с испанского.)

Я ищу дизайн БД для хранения этой информации и избежания несогласованности настолько, насколько позволяет InnoDB (поэтому у вас не может быть «дочерней компании», связанной с группой, или «прямой», связанной с компанией), особенно , после обновления (вы не сможете перевести холдинговую компанию в дочернюю, если у нее уже есть дочерние компании).

Можете ли вы дать мне несколько идей? Я никуда не ухожу: (

1 Ответ

0 голосов
/ 22 июля 2010

Обеспечение целостности данных в MySQL невозможно.MySQL молча отбрасывает ограничения проверки.Триггеры не надежны (например, триггер before insert не вызывается для каскадного удаления.) И даже если они надежны, триггеры MySQL не могут на самом деле помешать вставке строки.

Лучше всегоНадежда - это слой поверх MySQL, который обеспечивает соблюдение бизнес-правил.

...