|
|
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Вели переговоры с заказчиком. Коснулись структуры базы данных. Спор возник на неожиданном месте. Структуру в упрощенном виде привожу таблица 1. tbX xID xName таблица 2. tbY yID yName таблица 3. tbZ zID zName таблица 4(обобщенная). tbXYZ xyzid другие поля xID yID zID Я привык делать нормализованную структуру, и не задумываться. Заказчик настаивает на таком решении вместо четырех таблиц одна: tbXYZ_zakazchik xyzid другие поля xName yName zName Дополнительно скажу, что 1. В базе очень много записей. 2. Дублирований полей xName,yName,zName будут часто повторяться Заказчик настаивает на своем опыте, что будет система тормозить в случае, если структура будет нормализованной (мой вариант). Что при многочисленных выборках, надо делать join 3-x таблиц, что будет тормозить. Итд итп. Что добавление новых записей сложнее в моем варианте. Выношу мнение заказчика Вам на обсуждение. Что скажете? На чьей стороне правда? Имеет ли вообще право на жизнь его подход? Что скажут гуру, которые работают с большими базами? Какой подход предпочтительнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 22:16 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Challenger, на своем мнении настаивать не буду, тем более - типы полей не указаны. Но: Если xName,yName,zName занимают байт не более чем xID,yID,zID, то нечего нормализовывать, а если в несколько раз больше, то нормализции быть! При выполнении соединений достаточно разрешить грязное чтение практически неизменяемых справочников tbX, tbY, tbZ, чтобы даже выиграть в скорости чтения/записи данных в tbXYZ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 22:32 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
тип полей ID = int тип полей Name = varchar(128) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 22:57 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Challenger, думаю, еще один интересный вопрос - а меняются ли имена, эти самые xName, yName, zName? И если да, то надо ли их менять для всех записей в общей таблице? Если имена меняются, и их надо менять везде, то я бы предпочел нормализованную структуру. Если имена не меняются, точнее, по всей таблице их нет нужды менять, то дальше могут играть другие факторы. Дальше, объем - это понятно, строки занимают больше места чем int-ы. Сомнения в добавлении новых записей - смотря какие данные. Ничто не мешает, например, написать ХП, которая будет принимать имена, и заполнять справочные таблицы при необходимости. Так что с точки зрения программного интерфейса проблем не будет. Расскажите еще вот что: 1) что за данные (по сути) будут представлены в этой таблице. Если сильно привязано к предметной области или сложно для понимания, можно найти общепонятную аналогию, так думать легче. 2) каков режим их появления в БД, откуда и какими количествами будут приходить 3) соответственно, как и кем они будут читаться 4) говорите очень много заисей - это сколько? Потаблично. Пишите, будем думать дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 23:20 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Имена меняются, но не очень часто, раз в месяц, может измениться имя. Я этот момент сразу отметил при диалоге с заказчиком. Он ответил, что лучше напишет скрипт, который будет проходится по всей таблице и изменять имена. Про размер, я тоже сразу отметил. Заказчик отметил, что разница в размере данных не существенна. И главное быстрота работы с данными, формирование отчетов и добавление. Архитектура системы следующая. Есть набор баз данных, в которых большая путаница и данные не систематизированы. Есть наша база (про которую идет речь), в которой придумана схема как систематизировать данные. Есть сервис которые сливает данные из набора баз данных в нашу базу данных. Отвечаю на вопросы 1. В этих таблицах хранятся параметры некоторых объектов. Углубляться думаю тут не стоит в предметную область. Хотя может быть позже нарисую полную структуру. 2. Данные в таблицах появляются на основе работы сервисов. 2 режима: режим 1 - сервис ночью будет сливать все изменения за день. режим 2 - сервис будет моментально переносить изменения в реальном режиме времени. На первом этапе режим1, потом режим2. 3. Данные в базе данных будут использоваться для просмотра из клиентских приложений. 4. Записей в таблице tbXYZ 300000 сейчас, ежедневно увеличивается на 1000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 23:42 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
> будет система тормозить в случае, если структура будет нормализованной > Что при многочисленных выборках, надо делать join 3-x таблиц, что будет тормозить. на вычитки с сортировками - да, будет тормозить такое объединение, когда условия на несколько таблиц в объединении сразу - серверу приходится сначала соединение + условие, потом - сортировка. ессно, сканим все или достаточно много для того, чтобы "тормозило". очень не всегда лечится индексами > Что добавление новых записей сложнее в моем варианте. абсолютно монопенисуально. решается процедурами / представлениями с триггерами. хотя, конечно, стоимость разработки это чуть поднимет, но это смотря кто в команде. если нет сиквельщика - могут быть вопросы, но вряд ли проблемы > Имеет ли вообще право на жизнь его подход? да. в "отчетных" системах часто умышленно избыточно денормализуют данные. но потом что-то поменять - серьезное железо на уши становится > Какой подход предпочтительнее? крайне мало данных. с равным успехом используются все 3 варианта. опять же, пока нет кучи кода никто не мешает сразу сделать нормальзованное хранение, накрыть это все нужными представлениями и их "материализовать". но тут еще один фактов - на MSDE / Express это все работать не будет должным образом :) так что если система под десктопы - еще ограничений будет Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 23:56 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
ChallengerВели переговоры с заказчиком. Коснулись структуры базы данных. Спор возник на неожиданном месте. Структуру в упрощенном виде привожу таблица 1. tbX xID xName таблица 2. tbY yID yName таблица 3. tbZ zID zName таблица 4(обобщенная). tbXYZ xyzid другие поля xID yID zID Я привык делать нормализованную структуру, и не задумываться. ... Дополнительно скажу, что 1. В базе очень много записей. 2. Дублирований полей xName,yName,zName будут часто повторяться Заказчик настаивает на своем опыте, что будет система тормозить в случае, если структура будет нормализованной (мой вариант). Что при многочисленных выборках, надо делать join 3-x таблиц, что будет тормозить. Итд итп. Что добавление новых записей сложнее в моем варианте. 1. Непонятно, каким образом будут связываться данные из первых 3 таблиц в четвёртую. 2. Если алгоритм связывания относительно простой, то вполне может быть вариант с одной таблицей, в которой будут находиться все 3 таблицы, благо их структура совпадает. Только добавить поле, определяющее таблицу, что-то типа: FieldtbIDxIDxName Собирать же в обобщённый вариант можно с помощью PIVOT или агрегирующих функций. 3. Если возвращать пользователям тысячи и более записей, то "join 3-x таблиц" действительно может составить проблему, впрочем, в таком случае и выборка из одной обобщенной таблицы тоже не спасёт. В противном же случае, когда количество возвращаемых записей относительно невелико, то влияние join может оказаться не столь уж и пагубным. 4. Если заказчик сам всё знает, то может пусть сам и делает ? Иначе может возникнуть ситуация, когда, уступая заказчику, Вы же окажетесь виноватым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 07:21 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Сервер БД для того и нужен, чтобы джойнить, а не валить все данные в плоскую таблицу. Индексированные представления опять же есть. Думаю надо набросать структуру, заполнить тестовыми данными и посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 07:49 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
ChallengerДополнительно скажу, что 1. В базе очень много записей. 2. Дублирований полей xName,yName,zName будут часто повторяться 1)Из сказанного получается, что очень много записей - это относится к таблице 4 tbXYZ. А таблицы tbX, tbY, tbZ получается гораздо меньшего объема. Поэтому не думаю, что join с ними будет играть решающую роль в быстродействии. 2) Проще контролировать уникальность xName,yName,zName 3) Не получится ситуация, когда у части записей xName1 поменяли на xName2, а у остальных нет. 4) Если выборку делать по определенному xName, то индекс по xID всяко лучше чем индекс по xName. Т.е. тут еще зависит от наиболее часто употребляемых критериев выборки. Опять же,Challenger3. Данные в базе данных будут использоваться для просмотра из клиентских приложений, поэтому выборки по идее не будут большими. ChallengerЗаказчик настаивает на своем опытеОпыт Заказчика сложился на основе ДРУГОЙ структуры и ДРУГИХ запросов. Присоединяюсь к ChA ChA4. Если заказчик сам всё знает, то может пусть сам и делает ? Иначе может возникнуть ситуация, когда, уступая заказчику, Вы же окажетесь виноватым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 09:25 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Challenger, 300 тысяч - это не много. То, что они постоянно добавляются по 1000 в сутки - чуть-чуть хуже, таблица будет расти по 300 тыс в год и через 2 года уже достигнет лимона. Судя по описанию, у вас хранилище данных: много данных из разных источников, которые пользователи только читают. Это для OLAP или отчетов, судя по всему, делается. Тут денормализация - нормальная ситуация. В целом, я поддерживаю общее настроение на то, что не стоит полностью полагаться на слова заказчика. Тем не менее, решение должно быть адекватным. Какие будут запросы от пользователей? xName like '%555%' будут, или только равенства? Сколько значений в справочных таблицах? Будут ли какие-нибудь критерии по времени данных, например, что-то за последние 3 месяца? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 10:17 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
ChA 1. Непонятно, каким образом будут связываться данные из первых 3 таблиц в четвёртую. Почему непонятно. Там foreighn key, и отношение один ко многим, что по моему очевидно сходя из названий полей. ChA 4. Если заказчик сам всё знает, то может пусть сам и делает ? Иначе может возникнуть ситуация, когда, уступая заказчику, Вы же окажетесь виноватым. Не вдаваясь в детали, скажу, что здесь заказчик сам отвечает за структруру базы данных. Но обязан прислушиваться к нашим рекомендациям. Мы отвечаем за работу сервисов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 10:35 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
GeepСервер БД для того и нужен, чтобы джойнить, а не валить все данные в плоскую таблицу. Полностью поддерживаю. Еще подчеркну откуда дует ветер. Заказчик очень любит LOTUS. А там другая архитектура, в отличие реалиционных баз данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 10:37 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Козьма ПрутковChallenger, Какие будут запросы от пользователей? xName like '%555%' будут, или только равенства? Сколько значений в справочных таблицах? Будут ли какие-нибудь критерии по времени данных, например, что-то за последние 3 месяца? '%%555%' если и будут, то их будет немного. Справочных таблиц 3. В одной будет не больше 10 значений. Во второй не больше 20 значений. В третьей не больше 1000 значений. Дат здесь нету ни в одной из таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 10:52 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Плохо, что тему перенесли с форума по SQL серверу. Там больше экспертов, которые работают практически с большими объемами данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 10:54 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
Challenger'%%555%' если и будут, то их будет немного. Только эти "немного" запросов будут сильно тормозить - это-же скан по большой таблице. Ещё один вопрос - нужно-ли будет выводить список этих xName, yName, zName distinct значений из большой таблицы - это тоже медленно. А вообще самый главный вопрос - это бизнес-логика и типичные запросы. Денормализацию можно использовать при фиксации факта - когда нужно запомнить не правильные значения из справочника, а те, которые были введены, и при правке справочника их менять нельзя. Например, в таблице заказов я делал (грубо): id_товара - ссылка на идентификатор товара из справочника id_цены - ссылка на справочник цены, по которой был продан товар (там всякие вещи типа ценовой группы, периода действия и прочее) название товара - как было написано в распечатаном документе заказа цена - какая была в распечатаном документе заказа т.е. дополнительно к нормализованной структуре пишутся и денормализованные данные так, как их видел пользователь в момент заказа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 11:35 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
ChallengerПлохо, что тему перенесли с форума по SQL серверу. Там больше экспертов, которые работают практически с большими объемами данных.Поверьте, у вас не большие объемы. 300 тыс - это только кажется, что много. Да и миллион - это еще не смерть. У нас в БД - объектов окло 5 млн, при выборках приходится джоинить по 5-6 справочников (небольших, не более 1000 строк в справочнике). Поскольку по основным полям, по которым проходит отсечение данных, построены индексы - проблем с производительностью нет. И сервер (железка) у нас не какой-нибудь супернавороченный. Работает все под Oracle. Но и MS SQL совсем не Access, какой-нибудь. Проведите тест, покажите заказчику, что такая структура тормозить не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 11:46 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
ChallengerChA 1. Непонятно, каким образом будут связываться данные из первых 3 таблиц в четвёртую. Почему непонятно. Там foreighn key, и отношение один ко многим, что по моему очевидно сходя из названий полей.Слово "обощенная" обескуражило, не понял, что это стандартная "снежинка", таблица фактов, обвешанная справочниками. Оптимизатор MS SQL нормально работает с такой схемой. Конечно, многое зависит от типовых запросов, но "выигрывая" в отсутствии слияний, мы проигрываем в объёмах, и наоборот. Операции IO самые дорогие, поэтому может так случится, что слияние окажется более оптимальным. Судя по размерам, справочники вообще могут не вылезать из ОЗУ, поэтому стоимость слияний будет очень мала, а вот таблицу фактов придется постоянно поднимать с диска(ов), и чем "длиннее" записи, тем больше будет чтений данных. Это может запросто организовать "затык" в дисковой подсистеме, особенно, когда будет много параллельных запросов. P.S. В конце концов, несложно построить тестовый пример, и по производительности типовых запросов определить, что будет более оптимальным в конкретном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 11:59 |
|
||
|
Спор о структуре БД
|
|||
|---|---|---|---|
|
#18+
ChallengerGeepСервер БД для того и нужен, чтобы джойнить, а не валить все данные в плоскую таблицу. Полностью поддерживаю. Еще подчеркну откуда дует ветер. Заказчик очень любит LOTUS. А там другая архитектура, в отличие реалиционных баз данных. +1 Сам работаю по переносу данных с Lotus Domino на SQL Server в нормализованном виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 12:04 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35840823&tid=1543407]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
364ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 261ms |
| total: | 743ms |

| 0 / 0 |
