Управление иностранными ключами - PullRequest
2 голосов
/ 05 апреля 2010

Итак, у меня есть база данных с несколькими таблицами.

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 05 апреля 2010

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

Вы можете выполнить то, что вы описываете, с помощью триггера. Я не знаю синтаксис 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 голосов
/ 05 апреля 2010

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

номер

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

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

0 голосов
/ 05 апреля 2010

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

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

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

Предположим, что ваши таблицы выглядят так:
пользователей:
user_id PK
Пользователь

user_interests:
user_id 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 будет нулевым для интересов без данных.

0 голосов
/ 05 апреля 2010

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

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

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