Целостность данных и ограничения - PullRequest
4 голосов
/ 12 мая 2011

Используя следующую компоновку таблицы:

TABLE Something
(
    SomethingId             
    Name      
    DateCreated
    IsObsolete ('Y','N')       
    PRIMARY KEY (SomethingId)
    Foreign Key (SomethingTypeCode)
;


TABLE SomethingType
(
    SomethingTypeCode ('1','2','3')             
    Description             
    PRIMARY KEY (SomethingTypeCode)
);

При настройке PHP / MySQL есть какой-то способ, которым я могу ограничить ограничение или индекс, который для каждого SomethingTypeCode (1, 2, 3) указан вТаблица Something, с ней может быть связан только один IsObsolete = N?

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


РЕДАКТИРОВАТЬ:

В ответ напутаница, которую я получаю с ответом VoteyDisciple.

EmailTypeCode: P = Личный, B = Бизнес, S = Школа

Вот мой дизайн:

enter image description here

Это позволит лицу иметь более одного типа сообщений электронной почты в заданном типе (например, 2 рабочих сообщения), избежать дублирования в базе данных и не требовать нулевых значений.Так как меня интересует только одно активное электронное письмо в каждой категории (то, которое будет использоваться системой), именно здесь IsObsolete вступает в игру.Я могу хранить историю, избегать дублирования, избегать нулевых значений и обеспечивать уникальные адреса электронной почты, введенные в систему здесь.

Конечно, это также вызывает мою проблему, как указано в оригинальном вопросе.

Подход VoteyDisciple

VoteyDisciple Пожалуйста, дайте мне знать, если я изобразил это неправильно (или правильно).

enter image description here

«Если для данного типа может быть только один» - только один активный не время, не только один в системе.«Теперь ActiveId может быть NULL» - я подчеркнул, что я не хочу NULL"или это может указывать на конкретную запись Something."Тип определяет запись.

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

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Вы должны иметь возможность справиться с этим в триггере MySQL:

DELIMITER $$
CREATE TRIGGER before_something_update 
BEFORE UPDATE ON Something
FOR EACH ROW BEGIN
   IF NEW.IsObsolete = 'N' THEN
      UPDATE Something SET IsObsolete = 'Y' WHERE SomethingId != NEW.SomethingId AND SomethingTypeID = NEW.SomethingTypeId;
   END IF; 
DELIMITER ;

И что-то похожее на вставку.Триггер проверит, чтобы увидеть, пытаетесь ли вы установить для IsObselete значение N, а затем обновите все строки того же типа, которые не являются текущей строкой, и установите для них значение Y.

Вы можетеЕсли вы используете InnoDB, у вас могут возникнуть проблемы с блокировками, но я не думаю, что у вас возникнут проблемы с MyISAM.

0 голосов
/ 12 мая 2011

Если может быть только один для данного типа, это свойство SomethingType, а не Something.

TABLE SomethingType
(
    SomethingTypeCode ('1','2','3')             
    ActiveId
    Description             
    PRIMARY KEY (SomethingTypeCode)
    Foreign Key (Something)
);

Теперь ActiveId может быть NULL (указывая, что естьне устаревший (что-то для этого SomethingType), или он может указывать на конкретную запись Something.

И вы, очевидно, не можете разместить там более одного идентификатора, поэтому вы гарантированно получите либоноль или один активный элемент.

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