Разработка базы данных - несколько таблиц поиска / перечисления или одна большая таблица? - PullRequest
15 голосов
/ 18 мая 2009

У меня есть много таблиц, которые используют ссылки Lookup / Enum для большинства значений столбцов. Например:
Персональный стол - PersonID | RaceCode | HairColorCode | HairStyleCode | TeethConditionCode
Таблица местоположения - LocationID | SizeCode | ExteriorColorCode | ConditionCode
Такие вещи, как раса, размер, цвет, условие и т. Д., Будут просто ссылками на внешние ключи для таблицы поиска кода. Эта кодовая таблица имеет другие поля, но они не важны для моего вопроса. База данных предназначена для приложения SaaS, что означает, что у каждого клиента может быть свой собственный список Цветов, Рас, Условий и т. Д. Существуют некоторые коды, которые могут быть статическими, которые клиенты не могут изменить.

Лучше иметь 1 кодовую таблицу или 2 типа кодовых таблиц (DynamicCodeTable для определенных пользователем и StaticCodeTable для тех, которые меняются) или мне нужно иметь таблицу для каждого типа кода (RaceCodeTable, HairColorTable, Condition и т. Д.)?

Больше всего меня беспокоит соединение SQL. Таблица Person, с которой я работаю, имеет более 20 таких атрибутов кода. Есть ли разница в производительности при соединении с 20 различными таблицами VS, соединяющимися с одной и той же таблицей 20 раз? Наличие нескольких таблиц означает, что каждая таблица будет меньше, и поиск «должен» занять меньше времени. Но иметь один стол тоже можно быстро. Есть предложения?

Ответы [ 4 ]

24 голосов
/ 18 мая 2009

Эта тема подробно обсуждалась в течение последних пятнадцати лет в рамках темы «Одна таблица истинного поиска» (сокращенно OTLT). Преимущества такого подхода выпрыгивают из базы данных новичка. Недостатки появляются со временем. Смотрите эти ссылки для недостатков OTLT:

Или поиск для OTLT, чтобы найти больше обсуждений.

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

Что касается того, чтобы позволить пользователям вводить новый код ТИПОВ, а не просто новый код ЗНАЧЕНИЯ, который открывает целую большую банку червей. Смотрите выше статью, обсуждающую EAV. Это очень соблазнительно, потому что позволяет пользователям создавать свою собственную структуру данных. Если вы игнорируете производительность, это работает довольно хорошо некоторое время. Вы получаете совершенно общую базу данных без необходимости изучать структуру данных у пользователей или специалистов в данной области.

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

(отредактировано, чтобы заменить «интеллектуальный анализ данных» на «археология данных»)

13 голосов
/ 18 мая 2009

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

0 голосов
/ 18 мая 2009

Потенциальная разница в производительности.

Таблица, содержащая всего 2 строки, занимает много места в кэше для этих двух крошечных строк.

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

0 голосов
/ 18 мая 2009

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

Так, что я изучил?

  • для статических значений, просто используйте enum - это намного быстрее и удобнее. Это решение должно быть принято в зависимости от того, сколько других таблиц может ссылаться на одну и ту же переменную.
  • придерживайтесь меньшего количества таблиц поиска, а не создавайте столько, сколько можете придумать. СОЕДИНЕНИЯ гораздо медленнее.
  • , чтобы помочь себе ориентироваться, проектировать базу данных VIEWs. Это сделает вашу жизнь намного проще.
  • в качестве бонуса, если вы не хотите, чтобы ваши клиенты касались определенных таблиц (т.е. ваших статических) или касались значений столбцов enum, вы можете использовать детализированные разрешения MySQL (например), чтобы отключить изменения определенных столбцов в определенных таблицах. Многие люди не понимают, насколько гибкими могут быть эти разрешения.
...