2012-04-19 3 views
3

У меня есть сложный объект, который я пытаюсь сохранить в базе данных.Ограничение MySQL внешним ключом

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

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

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

Каковы ваши предложения по этому вопросу?

Edit:

Есть, вероятно, 15-20 различных типов объединений я мог бы использовать некоторые 3 глубоких уровней

+2

Как вы получаете экспоненциальное увеличение? Мне кажется, что вы бы больше увеличили коэффициент в 2 раза. Или это была просто фигура речи? –

+0

@Mark - Рисунок речи - я сейчас пытаюсь сделать грубый подсчет количества подключений, которые мне нужно будет сделать, если это поможет. – RS7

ответ

1

Я вижу три возможных способа реализации ограничений:

МИОНа может быть сделано для хранения любого истинного categorical variable в отдельной таблице и иметь внешний ключ, указывающий на эту таблицу всякий раз, когда ссылается. Это может помочь сохранить базу данных более чистой и удобной в обслуживании во многих случаях. Зная, что атрибут «Состояние» ваших пользователей - это числовая переменная от 1 до 50, а не строка, которая может быть «MA», «ma», «Mass» или «Massachusetts», безусловно, будет поддерживать ваших администраторов баз данных (и разработчиков и, таким образом, конечные пользователи) счастливы.

Однако, если ваша переменная не является действительно категоричной, но имеет некоторые конкретные критерии, вы можете наложить их с помощью CHECK constraints (данные MySQL here). Они позволяют определить определенный диапазон допустимых значений без необходимости перечисления каждого из возможных, что может быть полезно, если вы просто хотите проверить достоверность вставки без ущерба для поиска внешнего ключа.

Наконец, в бизнес-логике есть определенные ограничения. Я считаю, что сложные ограничения (сопоставление регулярных выражений и т. Д.) Лучше всего поддерживать в коде приложения, а не в базе данных SQL.

Обратите внимание, что внешний ключ не обязательно будет пагубным для производительности. Вы можете выполнить некоторые тесты, но я обнаружил, что выполнение соединения в большой таблице (500 тыс. Строк) в небольшой (20 строк) категориальной таблице не оказывает заметного влияния на производительность. Так что вы, вероятно, хорошо, не беспокоясь об этом.

Если у вас есть десятки потенциальных значений, которые вы хотите использовать ENUM, имейте в виду, что удар производительности будет возникать только при выполнении соединений, что не всегда необходимо. Часто для получения данных вы можете сделать только идентификаторы, а не фактические значения. В этом случае наличие внешнего ключа никоим образом не влияет на ваши SELECTS и только наносит незначительный штраф за каждое INSERT/UPDATE, так как системе необходимо будет проверить, что внешний ключ действителен.

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