Как сохранить целостность? - PullRequest
1 голос
/ 02 июля 2010

Мне просто интересно, как вы все создаете таблицы для поддержания целостности?

tblUserProfile

UserId
EyeColorId
HairColorId
RelationShipStatusId

и т.д.

Каждое из этих значений, таких как EyeColorId, имеет набор значений, таких как коричневый, черный, желтый, зеленый. У Similary HairColorId есть черный, блондин, малиновый и т. Д., А у RelationShipStatusId есть Разведенный, женатый, холостой и т. Д. Должен ли я создавать разные таблицы для каждой из них? как

tblEyeColor

EyeColorId
EyeColorCode

тогда: -

tblHairColor

HairColorId
HairColorCode

а также продолжать создавать таблицы? Таких таблиц много (примерно 20-25). Если я буду продолжать создавать эти таблицы и делать на них соединения, это ужасно замедлит мою производительность. Как вы все поддерживаете такие значения enum? Должен ли я сохранять ограничения проверки или я должен продолжать делать таблицы?

Ответы [ 3 ]

4 голосов
/ 02 июля 2010

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

Некоторые люди придерживаются идеи единой таблицы поиска, которая будет иметь идентификатор, группу изначение и, возможно, описание для каждой строки.Идентификатор и группа должны быть первичными ключами, поэтому у вас будет id = 1 и group = 1 для волос в качестве цвета волос BLONDE, id = 1 и group = 2 для глаз в качестве цвета глаз HAZEL и т. Д.

Другие посчитали бы это плохим денормализованным дизайном.

Объединения замедлят вас только тогда, когда число для конкретного запроса станет большим.

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

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

2 голосов
/ 02 июля 2010

Нет необходимости создавать таблицы, если число опций fixed. Вместо этого вы можете использовать Enum Тип в вашей таблице.например, столбец EyeColor будет Enum из Black, Brown, Blue

Однако я никогда не видел кого-то с зелеными глазами.LOL

1 голос
/ 02 июля 2010

Это традиционный метод, да.

Большинство современных СУБД будут кэшировать небольшие таблицы, подобные этим поискам, в течение продолжительных периодов времени, что устраняет потенциальные проблемы с несколькими объединениями.

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

...