Дизайн DB: 1-я нормальная форма и повторяющиеся группы

Вы можете объединить две ветви обратно в мастер, чтобы у вас были доступны все миграции. Если вам действительно не нужны эти миграции, но вы хотите иметь возможность выполнить откат, вы можете отредактировать таблицу schema_migrations в вашей базе данных, чтобы удалить строки, соответствующие миграциям, для которых у вас нет файлов. Однако это вызовет проблемы, если вы затем переключитесь на другую ветку с другими миграциями.

14
задан JoeCool 4 June 2009 в 15:28
поделиться

7 ответов

Design 2 and Design 4 are the best ways to go provided the results will not always be present (aka NULLs in Desigin 1). If they always are taken, then the first design is fine.

I believe repeating groups in SQL would actually be if you have a column stuffed with add'l values e.g. Phone_Number contains "123-444-4444,123-333-3334" etc.

Anyway, the later designs are suboptimal -- you continue to take that to the final level and have the "One True Lookup Table" http://www.dbazine.com/ofinterest/oi-articles/celko22 or Entity Attribute Value http://tonyandrews.blogspot.com/2004/10/otlt-and-eav-two-big-design-mistakes.html

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:10678084117056

Either way, it's almost always a bad thing. Although they may share a common datatype/domain, the meaning differs -- thus they should remain individual attributes (maxtemp, mintemp, etc.)

7
ответ дан 1 December 2019 в 15:12
поделиться

Я думаю (и меня учили) 1NF как «все строки должны быть одинаковой длины», а не «без повторяющихся групп». С этой точки зрения вам будет немного легче принять решение из следующего:

В проекте 1 ВСЕГДА присутствуют оба теста? Если так, то это действительно не повторяющаяся группа. Всегда ли присутствуют все средние в схеме 2? Может ли быть больше (или меньше) в данной строке?

В схеме 4 всегда ли присутствуют оба этих значения? Если так, то ничего страшного. В противном случае следует использовать конструкцию 5.

1
ответ дан 1 December 2019 в 15:12
поделиться

Вот правило повторяющихся групп - что функционально зависит?

Если значение статистики функционально зависит от SN, теста и имени статистики, то у вас есть три ключевых элемента и одно значение элемент. (SN, Тест, Статистика -> Значение)

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

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

Для ваших примеров, проследите за дизайном хранилища данных, чтобы найти более прагматичный тест:

Можете ли вы нарезать кубиками по другому ключу?

Думайте о своем статистическом факте как о точке, окруженной тремя измерениями: (SN, тест, статистика). Это действительно так? (Что касается сводных данных, они часто нечеткие.)

Вместо этого давайте посмотрим на подробные данные, которые нам следовало хранить: SN, Test, Score. Ясно, что на пересечении этих двух измерений есть два измерения (SN, Test) и одна мера (оценка). Мы можем получить любое количество статистических данных из этих подробных данных, используя любое измерение (SN или Test)

. В примере с батареей вы, вероятно, действительно захотите создать ее как базу данных EAV вместо более типичного реляционного база данных. Ваши измерения (AvergaeCurrent и BatteryCapacity) дают вам веские причины использовать дизайн базы данных Entity-Attribute-Value .

Обратите внимание, что ВСЕ реляционные конструкции представляют собой противоречие между более длинными отношениями и тройками EAV. Вы всегда должны балансировать между «это ключ» и «это столбец», потому что вы всегда можете пометить все как ключ атрибута и использовать дизайн EAV.

1
ответ дан 1 December 2019 в 15:12
поделиться

Если вы уверены, что «тест» (всегда) будет иметь только максимальное, минимальное и среднее значение -> используйте вариант 2. Однако, если возможно, что в будущем появится новая «статистика», лучше использовать схему 3.

Ответ на:

следует удалять и нормализовать повторяющиеся группы только в том случае, если они точно соответствуют один и тот же домен и имеют одно и то же значение?

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

0
ответ дан 1 December 2019 в 15:12
поделиться

Я предлагаю перемещать повторяющиеся группы только в отдельные таблицы, если они имеют переменную длину. Если у вас когда-либо будут только Phone1, Phone2 и Phone3, нет необходимости разделять их. В другом случае, если количество повторов варьируется, лучше оформить отдельную таблицу.

И ваша концепция точно такой же области и значения не очень интуитивна, потому что она зависит от уровня абстракции. Phone1 - это не совсем то же самое, что Phone2, но это оба номера телефона. Вы также можете создать таблицу AddressDetails и переместить туда номера телефонов. Но также имя, улица и город - все это детали адреса. Вы должны найти способ между общими парами ключ-значение и только выделенными столбцами.

0
ответ дан 1 December 2019 в 15:12
поделиться

Дизайн должен определяться вашими сценариями использования и типом ожидаемых запросов. Вы собираетесь выполнять много операций чтения, записи или обновлений? Вы хотите получить все тестовые данные для кандидата или вы хотите получить только лучший тест или что-то в этом роде. Какой запрос вы собираетесь выполнять чаще всего?

Вариант 1

SN     Test1_Max   Test1_Min    Test1_Mean  Test2_Max   Test2_Min    Test2_Mean
2093      23          2            15         54          -24           45  

Это лучший с точки зрения производительности. Не требует JOIN. Если количество полей является детерминированным, а не произвольным (например, у каждого человека не более двух результатов теста), тогда это лучше, хотя и более жестко, если вы решите связать более двух оценок теста с человеком. Поскольку SN здесь уникальный для каждой строки, механизм базы данных может вернуться, как только найдет совпадение, что является еще одной причиной повышения производительности.

Вариант 2

SN     Test      Max    Min    Mean     
2093    1        23     2      15       
2093    2        54     -24     45      

Это полезно, если SN 2093 может иметь N тестов в своем профиле. Точно так же, если количество тестов составляет, скажем, 10 метров, тогда этот дизайн также лучше, чем иметь 30 столбцов. Каждый запрос и сравнение будут довольно тяжелыми. Это также полезно, если вашему приложению требуются запросы, по которым он хочет получить наиболее эффективный тест для учащегося 2093 или, при желании, провести некоторую аналитику и составить отчет о результатах тестов. Он более гибкий, но немного медленнее, чем предыдущий. Я предпочитаю это, потому что у меня есть подозрение, что вы, вероятно, заинтересуетесь статистикой тестов, а студенты могут иметь более двух тестов каждый.

Вариант 3

SN     Test    Statistic    Value
2093    1        Max          23
2093    1        Min          2
2093    1        Mean         15       
2093    2        Max          54
2093    2        Min         -24
2093    2        Mean         45  

Это полезно, если ваши запросы больше всего интересуют значения. Например, если вас интересует, сколько значений больше 80, это будет быстро. В вашем сценарии это не имеет смысла. В конечном итоге вы будете делать слишком много самостоятельных JOIN. Чтение будет медленным! Однако запись, вероятно, будет быстрее, потому что вы можете быстро ОБНОВИТЬ максимальную оценку для SN 2093 и Тест 2 (при условии, что столбец статистики является перечислением, а не строкой, поскольку сравнение строк может быть

Вариант 4

SN      AverageCurrent (mA)    BatteryCapacity (mA)  
2093          200                    540  

Вариант 5

SN      mA_Measuremnt       Value
2093    AverageCurrent      200 
2093    BatteryCapacity     540 

Применяются те же аргументы. Это действительно зависит от того, собираетесь ли вы оптимизировать чтение или запись? Для веб-приложений, например, если вам это сойдет с рук, я предпочитаю Design 1. Например, я обычно знаю, что у пользователя будет не более трех телефонных номеров, поэтому я сделаю их полем в столбце пользователя и избегайте СОЕДИНЕНИЙ. Чтение происходит быстро, даже если для записи потребуется установить в некоторых полях значение NULL.

В конечном итоге вы будете делать слишком много самостоятельных JOIN. Чтение будет медленным! Однако запись, вероятно, будет быстрее, потому что вы можете быстро ОБНОВИТЬ максимальную оценку для SN 2093 и Тест 2 (при условии, что столбец статистики является перечислением, а не строкой, поскольку сравнение строк может быть

Вариант 4

SN      AverageCurrent (mA)    BatteryCapacity (mA)  
2093          200                    540  

Вариант 5

SN      mA_Measuremnt       Value
2093    AverageCurrent      200 
2093    BatteryCapacity     540 

Применяются те же аргументы. Это действительно зависит от того, собираетесь ли вы оптимизировать чтение или запись? Для веб-приложений, например, если вам это сойдет с рук, я предпочитаю Design 1. Например, я обычно знаю, что у пользователя будет не более трех телефонных номеров, поэтому я сделаю их полем в столбце пользователя и избегайте СОЕДИНЕНИЙ. Чтение происходит быстро, даже если для записи потребуется установить в некоторых полях значение NULL.

В конечном итоге вы будете делать слишком много самостоятельных JOIN. Чтение будет медленным! Однако запись, вероятно, будет быстрее, потому что вы можете быстро ОБНОВИТЬ максимальную оценку для SN 2093 и Тест 2 (при условии, что столбец статистики является перечислением, а не строкой, поскольку сравнение строк может быть

Вариант 4

SN      AverageCurrent (mA)    BatteryCapacity (mA)  
2093          200                    540  

Вариант 5

SN      mA_Measuremnt       Value
2093    AverageCurrent      200 
2093    BatteryCapacity     540 

Применяются те же аргументы. Это действительно зависит от того, собираетесь ли вы оптимизировать чтение или запись? Для веб-приложений, например, если вам это сойдет с рук, я предпочитаю Design 1. Например, я обычно знаю, что у пользователя будет не более трех телефонных номеров, поэтому я сделаю их полем в столбце пользователя и избегайте СОЕДИНЕНИЙ. Чтение происходит быстро, даже если для записи потребуется установить в некоторых полях значение NULL.

запись, вероятно, будет быстрее, потому что вы можете быстро ОБНОВИТЬ максимальную оценку для SN 2093 и Тест 2 (при условии, что столбец статистики является перечислением, а не строкой, поскольку сравнение строк может быть дорогостоящим) .

Вариант 4

SN      AverageCurrent (mA)    BatteryCapacity (mA)  
2093          200                    540  

Вариант 5

SN      mA_Measuremnt       Value
2093    AverageCurrent      200 
2093    BatteryCapacity     540 

Применяются те же аргументы. Это действительно зависит от того, собираетесь ли вы оптимизировать чтение или запись? Для веб-приложений, например, если вам это сойдет с рук, я предпочитаю Design 1. Например, я обычно знаю, что у пользователя будет не более трех телефонных номеров, поэтому я сделаю их полем в столбце пользователя и избегайте СОЕДИНЕНИЙ. Чтение происходит быстро, даже если для записи потребуется установить в некоторых полях значение NULL.

запись, вероятно, будет быстрее, потому что вы можете быстро ОБНОВИТЬ максимальную оценку для SN 2093 и Тест 2 (при условии, что столбец статистики является перечислением, а не строкой, поскольку сравнение строк может быть дорогостоящим) .

Вариант 4

SN      AverageCurrent (mA)    BatteryCapacity (mA)  
2093          200                    540  

Вариант 5

SN      mA_Measuremnt       Value
2093    AverageCurrent      200 
2093    BatteryCapacity     540 

Применяются те же аргументы. Это действительно зависит от того, собираетесь ли вы оптимизировать чтение или запись? Для веб-приложений, например, если вам это сойдет с рук, я предпочитаю Design 1. Например, я обычно знаю, что у пользователя будет не более трех телефонных номеров, поэтому я сделаю их полем в столбце пользователя и избегайте СОЕДИНЕНИЙ. Чтение происходит быстро, даже если для записи потребуется установить в некоторых полях значение NULL.

Это действительно зависит от того, собираетесь ли вы оптимизировать чтение или запись? Для веб-приложений, например, если вам это сойдет с рук, я предпочитаю Design 1. Например, я обычно знаю, что у пользователя будет не более трех телефонных номеров, поэтому я сделаю их полем в столбце пользователя и избегайте СОЕДИНЕНИЙ. Чтение происходит быстро, даже если для записи потребуется установить в некоторых полях значение NULL.

Это действительно зависит от того, собираетесь ли вы оптимизировать чтение или запись? Для веб-приложений, например, если вам это сойдет с рук, я предпочитаю Design 1. Например, я обычно знаю, что у пользователя будет не более трех телефонных номеров, поэтому я сделаю их полем в столбце пользователя и избегайте СОЕДИНЕНИЙ. Чтение происходит быстро, даже если для записи потребуется установить в некоторых полях значение NULL.

1
ответ дан 1 December 2019 в 15:12
поделиться

Дизайн 1 фактически находится в 1NF, если у вас есть PK на CustID. Это может быть в 3NF, если никакие данные не зависят от чего-либо, кроме PK, например Phone1 не повторяется для другого CustID.

Вы не можете выбрать модель без бизнес-кейсов, которые вы пытаетесь решить. Таким образом, Дизайн 1 может быть вполне допустимой логической моделью.

0
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: