Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Есть отчёт, в отчёт входит несколько разделов. Количество разделов может изменяться. Отчёт пишется для определённой компании на определённую дату. Цель - формирование новых отчётов с произвольной структурой из сохранённых в базе данных разделов. Возник спор - как это всё лучше в базе рассовать - один вариант это одна большаю таблица где ключом служит дата+номер организации (уникален) + много атрибутов по одному на каждый раздел (условно назовём их razd1,razd2,razd3) Второй - отдельная табличка для каждого раздела. Ключ- тот же. Выскажите пжалуйста своё мнение касательно обоих вариантов и чем они череваты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 11:39 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Очередной вечный двигатель (другое наименование - универсальная БД), ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 11:45 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Может шаблон создать и потом его редактировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 11:53 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Я против размножения таблиц, причём по сути одинаковых. Создавать новую таблицу при появлении нового раздела неразумно. Что будет, если потом раздел не будет использоваться? Как определить, создан нужный раздел или нет? Но я не совсем понял суть Вашего первого варианта... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 11:57 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
o.O В каком смысле - универсальная БД? По моему это стандартный вопрос нормализации (допустимы ли в таблице атрибуты кроме интересующего нас и первичного ключа - не помню какая это форма нормализации - 3я?) vs практичность (что легче поддерживать, писать вопросы, добавлять/удалять столбцы) и тд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 11:58 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Есть отчёт, он состаит из n частей-разделов (сейчас с десяток, резких изменений не предвидится, но принципиально не ограничен ничем кроме работоспособности и фантазии людей пишущих отчёты). Отчёт создаётся раз в месяц и целиком (то есть для всех полей одного отчёта за месяц март будет одинаковый атрибут организации и даты). Вариант1) Таблица: Report Поля: Date, OrgId , field1,field2,field3.... (fieldN - кусок текста соответствующий одному разделу отчёта) Вариант2) Таблица: Field1 Поля: Date, OrgId , data Таблица: Field2 Поля: Date, OrgId , data Таблица: Field3 Поля: Date, OrgId , data .... data в FieldN соответствует тому же что и fieldN в первом варианте. Уточняю что вопрос не в выборе первичного ключа - вполне допускаю введение отдельной таблицы и сурогатного ключа. Вопрос не о содержимом полей - и целесобразности сборки отчёта из кусков. Вопрос - какую структуру данных вы находите более удобной для работы с данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 12:15 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Naug Если я правильно понял, что Вы хотите, второй вариант представляется мне предпочтительным. Если я правильно понимаю, Вы ставите задачу сохранения в базе однажды сформированных отчетов. Каждый отчет состоит из N выборок данных. Давайте рассмотрим, что есть в каждом из случаев. 1) Все в одной таблице. (-) Потребуется регулярно добавлять новые колонки. На таблице с большим количеством строк (а сохраненные отчеты быстро вырастут до уймы строк) это легко может занять прорву времени (надо смотреть по серверу). Если же им еще потребуется значение по умолчанию - может и за ночь не уложиться. (-) Выборки намного тяжелее. Если в индексах хранятся null-ы - получится прорва сложных, составных индексов, каждый из которых лишь на несколько процентов индексирует реально нужные данные, а все остальное - забито информацией, которая никогда и ни при каких условиях не будет выбираться по этому индексу. Статистика идет лесом - если в выборке 1 селективен атрибут "фирма", а в выборке 2 селективен атрибут "контрагент" - в результирующей таблице они запросто окажутся равно бесполезны. (-) Довольно быстро окажется, что есть три-четыре атрибута с похожим смыслом (типа firm1_id, firm2_id, firm3_id), поскольку они нужны для выборки типа X. При этом по историческим причинам выборка Y использует в значении "фирма куда" firm1_id, в то время как выборка Z использует firm1_id в значении "фирма откуда", а добавленной позже "фирма куда" не остается ничего, как использовать firm2_id. В целом - полный бардак. Чтобы сразу назвать их firm_from_id, firm_to_id итп потребуется зверская убежденность, поскольку будет хор голосов "у нас же есть поле фирма - давайте использовать его для другой похожей операции. Зачем делать еще одно поле?". (-) Задачи сопровождения на такой таблице будет решать максимально тяжело. (-) Структурные задачи решаются максимально тяжело - например, нормально партиционировать такую таблицу вряд ли удастся; единственный вариант - по времени. (+) Все в одной таблице. Правда, не понимаю, чем это плюс. Мировой запас таблиц жестко ограничен? 2) Разные таблицы. Собственно, все наоборот. (-) Тяжелее решается задача "отчет состоит из гибкой конфигурации разделов". Если секции в отчете одного типа могут идти в разном порядке и/или количестве - потребуется согласование "номера секции" между таблицами. (+) Возможно гибкое управление. Например, таблицу с часто используемыми данными положить на быстрый диск. Например, таблицу с огромным объемом данных разбить на партиции. (+) Структура данных нормализована во всеми вытекающими преимуществами в плане простоты и удобства разработки и сопровождения. Достаточно представить себе документацию по "одной большой таблице" - "если значение поля "тип отчета" равно двенадцати, в поле "код фирмы" содержится код фирмы отправителя. Если значение поля "тип отчета" равно тринадцати..." (+) Проще и легче будет делать над-отчетную аналитику, например, сравнить данные по одному типу за разные периоды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 12:34 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
автор(-) Потребуется регулярно добавлять новые колонки. На таблице с большим количеством строк (а сохраненные отчеты быстро вырастут до уймы строк) это легко может занять прорву времени (надо смотреть по серверу). Если же им еще потребуется значение по умолчанию - может и за ночь не уложиться. Меня смущает то что во втором варианте потребуется добавить не одну колонку, а одну таблицу - соответственно все запросы тут же усложнятся (использованием join или доп аргументами where). Конечнно по идее они должны генериться автоматически, но всё же - что лучше - select с 6 полями из одной таблицы или select с 6 join-ами? И если мне нужно добавить дефолтовое значение - в новой таблице придётся сначала копировать список всех первичных ключей? авторТяжелее решается задача "отчет состоит из гибкой конфигурации разделов". Структура данных нормализована во всеми вытекающими преимуществами в плане простоты и удобства разработки и сопровождения. Достаточно представить себе документацию по "одной большой таблице" - "если значение поля "тип отчета" равно двенадцати, в поле "код фирмы" содержится код фирмы отправителя. Если значение поля "тип отчета" равно тринадцати..." Структура отчёта задаётся указанным пользователем внешним файлом-шаблоном. Есть например одна большаааая табличка с данными из баланса. 200 атрибутов. Имеет смысл делать 200 таблиц, или одну с 200-ми атрибутами? Спаибо насчёт информации о скорости работы - я раньше не сталкивался с такими объёмами данных чтобы структура принципиально влияла на производительность, но всё таки что лучше - 200 маленьких запросов на insert, или один большой. (Конечно при условии что этот большой вообще выполним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 13:00 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
NaugМеня смущает то что во втором варианте потребуется добавить не одну колонку, а одну таблицу - соответственно все запросы тут же усложнятся (использованием join или доп аргументами where). Вот этого не понял. Каждый запрос идет к одному разделу. Отчет состоит из серии разделов, то есть из серии запросов, каждый к своему разделу. Наоборот, SQL упрощается, поскольку не требуется дополнительно каждый раз фильтровать большую таблицу по "нужны данные N-го типа раздела". Naug Конечнно по идее они должны генериться автоматически, но всё же - что лучше - select с 6 полями из одной таблицы или select с 6 join-ами? И если мне нужно добавить дефолтовое значение - в новой таблице придётся сначала копировать список всех первичных ключей? Не понял. Если Вы имеете в виду "держать N атрибутов в одной таблице" либо "держать N тех же атрибутов в виде N отдельных таблиц" - первое куда лучше. Вопрос в том, что имхо и то, и другое - не очень-то хорошо. Naug Есть например одна большаааая табличка с данными из баланса. 200 атрибутов. Имеет смысл делать 200 таблиц, или одну с 200-ми атрибутами? Одну. Вопрос в том, что на другую таблицу, с проводками, надо использовать другую отчетную таблицу, а не ту же, что и "балансовые разделы отчетов". NaugСпаибо насчёт информации о скорости работы - я раньше не сталкивался с такими объёмами данных чтобы структура принципиально влияла на производительность, но всё таки что лучше - 200 маленьких запросов на insert, или один большой. (Конечно при условии что этот большой вообще выполним. Я очень затрудняюсь представить себе условия, при которых двести будут лучше. Если замерить варианты - почти уверен, что "двести маленьких" окажется в среднем раз в сто хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 13:14 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
авторВот этого не понял. Каждый запрос идет к одному разделу. Отчет состоит из серии разделов, то есть из серии запросов, каждый к своему разделу. Наоборот, SQL упрощается, поскольку не требуется дополнительно каждый раз фильтровать большую таблицу по "нужны данные N-го типа раздела". Сейчас запрос одного раздела для определённой организации и даты , в первом варианте выглядит так - Код: plaintext Код: plaintext То есть разница не принципиальна + во втором варианте мы экономим место на потенциально пустые разделы, можем лучше использовать индексы и тд и тп. Однако если нужно отобрать одно поле для отчёта по нескольким другим (например определённую характеристику для всех компаний со статусом "хороший клиент" выглядеть это в первом варианте будет так Код: plaintext Код: plaintext Ну, естессно так как в полях длинные куски текста то будет не =, а Like но это уже детали. С введением сурогатного ключа запос упростится, но всё равно будет как минимум один вложенный запрос. Вот такое соображение - или я неправильно запрос составил? авторНе понял. Если Вы имеете в виду "держать N атрибутов в одной таблице" либо "держать N тех же атрибутов в виде N отдельных таблиц" - первое куда лучше. Вопрос в том, что имхо и то, и другое - не очень-то хорошо. не "держать N тех же атрибутов в виде N отдельных таблиц", а держать каждый из N тех же атрибутов в N отдельных таблиц. Но в остальном именно так. А как со стороны выглядела система описанная мной? И какой паттерн хранения применили бы ВЫ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 13:39 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
авторВопрос в том, что на другую таблицу, с проводками, надо использовать другую отчетную таблицу, а не ту же, что и "балансовые разделы отчетов".А, я просто не въехал в слово "проводка" - это часть отчёта такая? То есть если я правильно понял Вы бы разбили мою большую таблицу на несколько меньших где атрибуты схожи "по смыслу" - вполне допускаю, в принципе сейчас у меня две таблицы - баланс и "остальное", проблема в том имеет ли смысл дробить дальше - в "остальном" сейчас дюжина аттрибутов (но их может стать больше, хотя сомневаюсь что больше пары десятков в обозримом будущем) и провести чёткое разбиение на группы я затрудняюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 13:47 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
NaugТаблица: Report Поля: Date, OrgId , field1,field2,field3.... (fieldN - кусок текста соответствующий одному разделу отчёта) Я может совсем не врубаюсь в тему спора, сори, но если сделать так Таблица: Report Поля: Date, OrgId ,N, field (field - кусок текста соответствующий одному разделу отчёта N - какому разделу соответствующий) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 15:25 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Naug Сейчас запрос одного раздела для определённой организации и даты , в первом варианте выглядит так - Код: plaintext Не понял. Я бы предположил, что так делается запрос "всего-всего-всего" для организации X на дату Y - всех строк всех разделов, примерно так. Naug Однако если нужно отобрать одно поле для отчёта по нескольким другим (например определённую характеристику для всех компаний со статусом "хороший клиент" выглядеть это в первом варианте будет так Стоп. Я окончательно перестал Вас понимать. В таблицах лежат сохраненные данные отчетов? Или что? В общем, сформулируйте подробнее постановку задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 16:42 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
авторНе понял. Я бы предположил, что так делается запрос "всего-всего-всего" для организации X на дату Y - всех строк всех разделов, примерно так. Мне тоже начинает казаться что мы говорим о чём-то разном. Что бы выбрать всё-всё-всё я в sql использую значёк "*", а если я указал конкретное поле значит именно его я и хочу получить. В таблицах лежат сохранённые данные отчётов. Дилема в следующем: 1)Иметь одну таблицу с одним первичным ключём (с множеством колонок -по числу разделов в отчёте - я вовсе не складываю все данные в одну ячейку. Это - в соседней теме) 2)Иметь множество таблиц (по числу разделов в отчёте) каждая из которых состоит из первичного ключа + одной-единственной колонки в который и лежит информация об одном разделе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 16:55 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
Предлагаю второй вариант только не размножать таблица Tab1 Tab2 Tab3 .... TabN А сделать проще добавить в таблице еще 1-но поле, раздел Date, OrgId, data, Razdel ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 17:25 |
|
||
|
Tаблицы vs. Атрибуты
|
|||
|---|---|---|---|
|
#18+
NaugВ таблицах лежат сохранённые данные отчётов. Дилема в следующем: 1)Иметь одну таблицу с одним первичным ключём (с множеством колонок -по числу разделов в отчёте - я вовсе не складываю все данные в одну ячейку. Следует ли понимать так, что в одном поле одной строки будет лежать весь "раздел"? Тогда да, одна таблица будет наиболее удобна. Я исходил из модели, что раздел - это некая выборка, то есть N полей на K строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 18:31 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33027629&tid=1545931]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
130ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 446ms |

| 0 / 0 |
