2010-04-05 3 views
2

Итак, у меня есть база данных с несколькими таблицами.Управление внешними ключами

Первая таблица содержит идентификатор пользователя, имя и фамилию.

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

Существует еще одна таблица, в которой есть все идентификаторы интересов.

Для каждого идентификатора интересов (даже если новые добавлены), мне нужно убедиться, что у каждого пользователя есть запись для этого идентификатора интереса (даже если его пустое или имеет значения по умолчанию).

Помогут ли иностранные ключи в этом сценарии? или мне нужно будет использовать PHP для обновления каждой записи при добавлении нового ключа?

ответ

0

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

Это звучит, как вам нужно OUTER JOIN (либо LEFT или RIGHT) в одном из ваших запросов вместо.

Например, если вы хотите, чтобы получить уровень интереса конкретного человека имеет для каждого интереса:

Если предположить, что ваши таблицы выглядеть следующим образом:
пользователей:
user_id PK
пользователя

user_interests:
идентификатор_пользователя PK FK
interest_id ПК ФК
interest_level

интересы:
interest_id PK
интерес

SELECT i.interest, ui.interest_level 
FROM interests i 
INNER JOIN user_interests ui USING (interest_id) 
LEFT JOIN users u USING (user_id) 
WHERE user_id = ? 

? является заполнителем.

Отметьте, что ui.interest_level будет null для интересов без данных.

1

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

Вы можете выполнить то, что описываете с помощью триггера. Я не знаю синтаксис MySql, но в SQL Server, это будет выглядеть примерно так:

CREATE TRIGGER TR_ensure_user_interest ON interest FOR INSERT, UPDATE AS 
BEGIN 
    INSERT user_interest (user_id, interest_id) 
    SELECT user_id, interest_id 
     FROM inserted 
      ,user 
    EXCEPT (SELECT user_id, interest_id) 
END 

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

ОБНОВЛЕНИЕ: Я согласен с остальными, которые наблюдали дизайн «запах» здесь. Если вы можете выполнить требуемый результат с помощью запросов JOIN, это будет гораздо более эффективное решение. Тем не менее, я пытался ответить на фактически заданный вопрос. (Кроме того, я был в этой ситуации, где физические записи полезны для других пользователей базы данных, которые не являются адептами в сложных запросах.)

+0

Спасибо, что нашли время ответить на мой вопрос. Это полезно знать, но я думаю, что я действительно ищу что-то в соответствии с тем, что предоставил OMG Unicorns. Я думаю, что триггер окажется слишком накладным. – jwzk

0

Похоже, вы заставляете свой физический дизайн слишком плотно отражать ваш логический дизайн.

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

0

«Помогут ли иностранные ключи в этом сценарии?»

No.

Ваше ограничение является своего рода "полноты" ограничения. Это означает, что для каждого нового добавленного интереса должно быть столько строк, добавленных в таблицу USER_INTEREST, как есть пользователи.

Система SQL не может обеспечить ее соблюдение. Это зависит от вас, чтобы обеспечить его соблюдение с помощью кода.

Смежные вопросы