|
|
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
Моё знание СУБД на уровне простеньких инсёртов и селектов, до сих пор никаких сомнение насчёт 1нф не было. Но сейчас появилась необходимость поднять более серьёзную БД, где привод к 1нф количество полей возведётся в 3-4 степень. Хотелось бы почитать мнения к нескольким примерам: Вики: Хорошим способом принятия решения о необходимости разбиения атрибута на части является вопрос: «будут ли части атрибута использоваться по отдельности?». Если да, то атрибут следует разделить (но так, чтобы сохранились осмысленные части атрибута). 1) На каком уровне имеется в виду "использоваться по отдельности"? К примеру у меня есть столбец ФИО, по которому нету выборки, и на экран ФИО всегда будет выводится вместе, но есть необходимость разделить на уровне интерфейса, к примеру фамилия красная, имя зелёное, отчество синее. 2)День рождения сотрудника YYYY.MM.DD. Мне нужны будут только 2 селекта: YYYY, что бы знать какого сотрудника направить на курсы, и MM.DD что бы знать кого поздравить с ДР, а целиком YYYY.MM.DD никогда не нужны, неужели надо кидать по разным столбцам YYYY И MM.DD? 3)Ещё пример: есть две таблицы: первая - справочник с продуктами и цены на них, вторая- таблица рецептов состоящая из кол-во определённых продуктов из справочника. Результат - цена блюда. На сколько понимаю, каждый компонент рецепта теоретически должен находится на отдельном ряду, но ведь рецепт един, и по частям не используется. А если каждый рецепт содержит от нескольких до сотен компонентов, рецептов - миллионы, рецепты поделены по тысячам тегов, то таблица будет огромная, и тормозная. На сколько правильно в такой ситуации, в одну ячейку сувать несколько внешних ключей и рулить этим с помощью триггера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 15:48 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
isapper1) На каком уровне имеется в виду "использоваться по отдельности"? На уровне сервера (операций на сервере). Если сервер получает единое значение, возвращает единое значение и нигде внутри себя его не делит - значит, оно атомарное. А что с ним будет делать кто-то другой где-то там - его дело. isapperнеужели надо кидать по разным столбцам YYYY И MM.DD? Если подходить к вопросу буквально, то да. Чтобы объяснить, почему - допустим, MM.DD надо знать секретарю отдела, чтобы организовывать поздравления с ДР. А YYYY ему знать не надо, и вообще, для некоторых сотрудников он может быть не введён при введённом MM.DD. Другой пример: нужно эффективно выбрать людей, которых поздравлять сегодня, а СУБД не поддерживает функциональные индексы. С практической же точки зрения (почти всегда) лучше таки держать их вместе. Надеюсь, не надо объяснять, почему. isapperНа сколько правильно в такой ситуации, в одну ячейку сувать несколько внешних ключей и рулить этим с помощью триггера? Ни насколько не правильно. Вернее, правильно только в том случае, если рецепт не обсчитывается в СУБД, а весь целиком отдаётся наружу. Но попробуйте, например, написать селект, считающий по рецепту цену готового блюда, сразу ощутите. А в чём разница между миллионами строк и миллионами значений, упакованными в меньшее количество строк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 16:02 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
isapper1) На каком уровне имеется в виду "использоваться по отдельности"? К примеру у меня есть столбец ФИО, по которому нету выборки, и на экран ФИО всегда будет выводится вместе, но есть необходимость разделить на уровне интерфейса, к примеру фамилия красная, имя зелёное, отчество синее. Если у Вас одно поле "ФИО", то иногда трудно бывает определить что является "Фамилия", "Имя" и "Отчество". Если они в таблице разделены, то Вы однозначно определяете "что, есть что". Соответственно Вам нужно исходить из задачи. Если Вам не нужна точная информация по ФИО, то можно ограничится одним полем, если нужна, то делите на три. isapper2)День рождения сотрудника YYYY.MM.DD. Мне нужны будут только 2 селекта: YYYY, что бы знать какого сотрудника направить на курсы, и MM.DD что бы знать кого поздравить с ДР, а целиком YYYY.MM.DD никогда не нужны, неужели надо кидать по разным столбцам YYYY И MM.DD? В данном случае лучше хранить в одном поле, т.к. практически во всех СУБД хорошие инструменты манипуляции с датой/временем. И разделение поля "Дата" на "Год", "Месяц", "День" не является оправданным. isapper3)Ещё пример: есть две таблицы: первая - справочник с продуктами и цены на них, вторая- таблица рецептов состоящая из кол-во определённых продуктов из справочника. Результат - цена блюда. На сколько понимаю, каждый компонент рецепта теоретически должен находится на отдельном ряду, но ведь рецепт един, и по частям не используется. А если каждый рецепт содержит от нескольких до сотен компонентов, рецептов - миллионы, рецепты поделены по тысячам тегов, то таблица будет огромная, и тормозная. На сколько правильно в такой ситуации, в одну ячейку сувать несколько внешних ключей и рулить этим с помощью триггера? Да. Кроме того нужна третья таблица с отношением "многие ко многим" :-) Т.е. таблица названий рецептов (например "название", "описание приготовления"), таблица ингредиентов с ценами за единицу, таблица рецепта который связывает первую таблицу со второй плюс еще поле "количество". А внешних ключей и триггеров бояться не надо. Все современные СУБД с ними хорошо работают. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 16:07 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
1. делать разборку XML ? 2. Чушь. Достаточно отделить год/месяц YEAR(MyField)=.... AND Month(MyField)=.... или поставить фильтр на диапазон. 3. Ничего страшного. Даже миллион записей это сущая чепуха. В т.ч. для ноутбука. Главное, чтоб были правильные структура/индексы/запросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 16:13 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
On 12/08/2011 04:48 PM, isapper wrote: > сомнение насчёт 1нф не было. Но сейчас появилась необходимость поднять более На самом деле вопрос действительно очень сложный. > серьёзную БД, где привод к 1нф количество полей возведётся в 3-4 степень. Кол-во полей в таблице не является объектом оптимизации при проектировании структуры БД. Ты можешь иметь в таблице столько полей, сколько тебе нужно. Единственное ограничение -- это физический размер записи, как правило, он в СУБД ограничен каким-то верхним порогом. Т.е. кол-во полей должно быть разумно небольшим. Как правило, при грамотном проектировании БД кол-во полей невелико, 10-20. Увеличение кол-ва полей на 3-4 порядка -- это конечно же уже криминал, надо смотреть на детали проблемы, скорее всего, опять таки что-то не хорошо с дизайном БД. > Хотелось бы почитать мнения к нескольким примерам: > > /Вики: Хорошим способом принятия решения о необходимости разбиения атрибута на > части является вопрос: «будут ли части атрибута использоваться по отдельности?». > Если да, то атрибут следует разделить (но так, чтобы сохранились осмысленные > части атрибута)./ Это правильное замечание, только необходимо одно дополнение: "на стороне СУБД". Т.е. "будут ли части атрибута использоваться по отдельности внутри СУБД (на языке SQL)". Если да, то следует разделять. > 1) На каком уровне имеется в виду "использоваться по отдельности"? К примеру у > меня есть столбец ФИО, по которому нету выборки, и на экран ФИО всегда будет > выводится вместе, но есть необходимость разделить на уровне интерфейса, к > примеру фамилия красная, имя зелёное, отчество синее. Только если эти части используются по отдельности внутри СУБД, в запросах, индексах и т.п. > 2)День рождения сотрудника YYYY.MM.DD. Мне нужны будут только 2 селекта: YYYY, > что бы знать какого сотрудника направить на курсы, и MM.DD что бы знать кого > поздравить с ДР, а целиком YYYY.MM.DD никогда не нужны, неужели надо кидать по > разным столбцам YYYY И MM.DD? По-нормальному, да. Однако, есть и у этого правила нюансы, оно не абсолютно жёсткое. Именно поэтому с ним часто и случаются проблемы даже у опытных разработчиков БД (слышал о таком совсем недавно). Например, в этом конкретном случае твоя СУБД может поддерживать операции выделения частей из даты, может поддерживать даже индексацию по таким частям (индекс по выражению). Тогда тебе для того, чтобы получить "сотрудников для направления на курсы" нужно будет написать запрос типа Код: sql 1. а для дней рождения Код: sql 1. 2. 3. или же для первого случая написать запрос типа Код: sql 1. где ?year_begin? и ?year_end? -- даты начала и конца года тех, которым пора на курсы, вычисленные заранее. Отдельный очень тонкий момент -- это производительность таких запросов. Даже если у тебя будет потенциально плохая производительность, вам может быть на это наплевать, либо в силу того, что таблица маленькая, либо в силу того, что запрос редко выполняется и люди могут подождать. > 3)Ещё пример: есть две таблицы: первая - справочник с продуктами и цены на них, Цена на продукт в таблице продукта -- уже криминал. (правда, это не нарушение 1НФ, а 3-ей). Цена как правило зависит от времени, она меняется, продукты -- нет. > вторая- таблица рецептов состоящая из кол-во определённых продуктов из > справочника. Результат - цена блюда. На сколько понимаю, каждый компонент > рецепта теоретически должен находится на отдельном ряду, Это я не понял, что за ряды такие. Вообще-то три таблицы должно быть. Блюдо, его состав (1:M от блюда, со ссылкой на продукт), продукт. Ну и цена продукта по датам (на самом деле это всё же стоимость продукта, а не цена), это - четвёртая таблица. но ведь рецепт един, и > по частям не используется. А если каждый рецепт содержит от нескольких до сотен > компонентов, рецептов - миллионы, рецепты поделены по тысячам тегов, то таблица > будет огромная, и тормозная. Наплевать, это всё равно копейки для современных реляционных СУБД. Даже если состав блюда будет несколько миллионов, ничего страшного. На сколько правильно в такой ситуации, в одну > ячейку сувать несколько внешних ключей и рулить этим с помощью триггера? Это настолько безобразно, что я даже слов не подберу. Все неприличные. Это абсолютно неправильно и безграмотно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 16:26 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
On 12/08/2011 05:13 PM, LSV wrote: > 1. делать разборку XML ? Я бы не стал совать XML во все дыры, где оно не нужно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 16:27 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 12/08/2011 05:13 PM, LSV wrote: > 1. делать разборку XML ? Я бы не стал совать XML во все дыры, где оно не нужно. "Сам не хачу, слюшай !" (с) кено :) Но как вариант разборки на клиенте или аппсервере - вполне. зы: никогда не использовал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 16:47 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
А процедуры являются внешней или внутренний частью сервера? Дело в том, что пример с рецептами имеет трёхмерную структуру данных (рецепт*компоненты*тег). В моем случае измерений немного больше, и инсёртов + апдэйтов будет где-то как селектов. А после того как я почитал про тип array в Postgres я подумал о том, что с помощью него можно объединить некоторые внешние ключи в один столбец. Это я думаю сделать именно для ускорение инсёртов и апдейтов, так как из-за многомерности будет много индексов, что в свою очередь будет тормозить инсёрты. Не зря я интересовался первыми двумя примерами, исходя из них мне ничего не мешает сделать две БД одна для справочника, одна для рецептов, внешние ссылки хранить в одной ячейки, а объединение делать при помощи внешних скриптов, того же PHP. И это теоретически, не будет нарушать 1НФ, но правда будет ли подобное объединение удовлетворять 2нф непонятно. И если так можно, то можно и вместо внешнего PHP использовать внутренний скрипт, тот же PHP(pl/php). И всё-таки где могут быть полезны массивы? Как раз в первом примере что ли? что бы удобнее было из вне делить данные. Вместо избыточного и тормознутного XML, как предлагалось выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 18:19 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
Ну и небольшое замечание: смешать в одну кучу, слить в одно поле и т.д. операция простая и безболезненная, а вот обратное неверно, поэтому даже если СЕЙЧАС оно обрабатывается целиком, то всегда хочется оставить свободу маневра на ПОТОМ http://ru.wikipedia.org/wiki/Разделяй_и_властвуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 18:25 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
isapper А после того как я почитал про тип array в Postgres я подумал о том, что с помощью него можно объединить некоторые внешние ключи в один столбец.Еще раз перечитай пост MasterZiv про настолько безобразно, что я даже слов не подберу. Все неприличные. isapper Это я думаю сделать именно для ускорение инсёртов и апдейтовне там копаешь. На крайний случай не индексируй внешние ключи, не обновляй неизменные поля и т.д. isapper исходя из них мне ничего не мешает сделать две БД одна для справочника, одна для рецептов, внешние ссылки хранить в одной ячейки, а объединение делать при помощи внешних скриптов, того же PHPЛюбой может обмануть таксиста - деньги заплатить и никуда не поехать. isapper И всё-таки где могут быть полезны массивы? Хороший вопрос, особенно при том что каждая СУБД их поддерживает по-своему, а csv хотя бы стандартен, и избыточный и тормознутый XML тоже стандартен, плюс индексируем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 18:44 |
|
||
|
где грань между избыточностью и 1нф?
|
|||
|---|---|---|---|
|
#18+
On 12/08/2011 07:19 PM, isapper wrote: > А процедуры являются внешней или внутренний частью сервера? Хранимые процедуры -- внутренней. А после того как я почитал про тип array в > Postgres я подумал о том, что с помощью него можно объединить некоторые внешние > ключи в один столбец. Подумал неправильно. Это я думаю сделать именно для ускорение инсёртов и > апдейтов, так как из-за многомерности будет много индексов, что в свою очередь > будет тормозить инсёрты. Не парься про это. Просто вставляй. > Не зря я интересовался первыми двумя примерами, исходя из них мне ничего не > мешает сделать две БД одна для справочника, одна для рецептов, внешние ссылки > хранить в одной ячейки, а объединение делать при помощи внешних скриптов, того > же PHP. И это теоретически, не будет нарушать 1НФ, но правда будет ли подобное > объединение удовлетворять 2нф непонятно. И если так можно, то можно и вместо > внешнего PHP использовать внутренний скрипт, тот же PHP(pl/php). Это всё ты ересь какую-то несёшь. > И всё-таки где могут быть полезны массивы? На клиенте. Вне реляционной СУБД. Внутри СУБД для _Х_Р_А_Н_Е_Н_И_Я_ каких-то массивов данных, например, научных типа значений функции какой-то в N точках. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 18:46 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37565981&tid=1541909]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 270ms |
| total: | 503ms |

| 0 / 0 |
