powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Tаблицы vs. Атрибуты
17 сообщений из 17, страница 1 из 1
Tаблицы vs. Атрибуты
    #33027181
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть отчёт, в отчёт входит несколько разделов. Количество разделов может изменяться. Отчёт пишется для определённой компании на определённую дату.
Цель - формирование новых отчётов с произвольной структурой из сохранённых в базе данных разделов.

Возник спор - как это всё лучше в базе рассовать - один вариант это одна большаю таблица где ключом служит дата+номер организации (уникален) + много атрибутов по одному на каждый раздел (условно назовём их razd1,razd2,razd3)

Второй - отдельная табличка для каждого раздела. Ключ- тот же.

Выскажите пжалуйста своё мнение касательно обоих вариантов и чем они череваты
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027199
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередной вечный двигатель (другое наименование - универсальная БД), ИМХО.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027243
zass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может шаблон создать и потом его редактировать?
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027267
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я против размножения таблиц, причём по сути одинаковых. Создавать новую таблицу при появлении нового раздела неразумно. Что будет, если потом раздел не будет использоваться? Как определить, создан нужный раздел или нет? Но я не совсем понял суть Вашего первого варианта...
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027273
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o.O В каком смысле - универсальная БД?

По моему это стандартный вопрос нормализации (допустимы ли в таблице атрибуты кроме интересующего нас и первичного ключа - не помню какая это форма нормализации - 3я?) vs практичность (что легче поддерживать, писать вопросы, добавлять/удалять столбцы) и тд.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027348
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть отчёт, он состаит из 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 в первом варианте.

Уточняю что вопрос не в выборе первичного ключа - вполне допускаю введение отдельной таблицы и сурогатного ключа. Вопрос не о содержимом полей - и целесобразности сборки отчёта из кусков.

Вопрос - какую структуру данных вы находите более удобной для работы с данными.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027402
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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) Разные таблицы. Собственно, все наоборот.

(-) Тяжелее решается задача "отчет состоит из гибкой конфигурации разделов". Если секции в отчете одного типа могут идти в разном порядке и/или количестве - потребуется согласование "номера секции" между таблицами.

(+) Возможно гибкое управление. Например, таблицу с часто используемыми данными положить на быстрый диск. Например, таблицу с огромным объемом данных разбить на партиции.

(+) Структура данных нормализована во всеми вытекающими преимуществами в плане простоты и удобства разработки и сопровождения. Достаточно представить себе документацию по "одной большой таблице" - "если значение поля "тип отчета" равно двенадцати, в поле "код фирмы" содержится код фирмы отправителя. Если значение поля "тип отчета" равно тринадцати..."

(+) Проще и легче будет делать над-отчетную аналитику, например, сравнить данные по одному типу за разные периоды.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027492
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор(-) Потребуется регулярно добавлять новые колонки. На таблице с большим количеством строк (а сохраненные отчеты быстро вырастут до уймы строк) это легко может занять прорву времени (надо смотреть по серверу). Если же им еще потребуется значение по умолчанию - может и за ночь не уложиться.

Меня смущает то что во втором варианте потребуется добавить не одну колонку, а одну таблицу - соответственно все запросы тут же усложнятся (использованием join или доп аргументами where). Конечнно по идее они должны генериться автоматически, но всё же - что лучше - select с 6 полями из одной таблицы или select с 6 join-ами? И если мне нужно добавить дефолтовое значение - в новой таблице придётся сначала копировать список всех первичных ключей?

авторТяжелее решается задача "отчет состоит из гибкой конфигурации разделов".

Структура данных нормализована во всеми вытекающими преимуществами в плане простоты и удобства разработки и сопровождения. Достаточно представить себе документацию по "одной большой таблице" - "если значение поля "тип отчета" равно двенадцати, в поле "код фирмы" содержится код фирмы отправителя. Если значение поля "тип отчета" равно тринадцати..."


Структура отчёта задаётся указанным пользователем внешним файлом-шаблоном.

Есть например одна большаааая табличка с данными из баланса. 200 атрибутов. Имеет смысл делать 200 таблиц, или одну с 200-ми атрибутами?

Спаибо насчёт информации о скорости работы - я раньше не сталкивался с такими объёмами данных чтобы структура принципиально влияла на производительность, но всё таки что лучше - 200 маленьких запросов на insert, или один большой. (Конечно при условии что этот большой вообще выполним.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027546
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaugМеня смущает то что во втором варианте потребуется добавить не одну колонку, а одну таблицу - соответственно все запросы тут же усложнятся (использованием join или доп аргументами where).
Вот этого не понял.

Каждый запрос идет к одному разделу. Отчет состоит из серии разделов, то есть из серии запросов, каждый к своему разделу. Наоборот, SQL упрощается, поскольку не требуется дополнительно каждый раз фильтровать большую таблицу по "нужны данные N-го типа раздела".

Naug
Конечнно по идее они должны генериться автоматически, но всё же - что лучше - select с 6 полями из одной таблицы или select с 6 join-ами? И если мне нужно добавить дефолтовое значение - в новой таблице придётся сначала копировать список всех первичных ключей?
Не понял. Если Вы имеете в виду "держать N атрибутов в одной таблице" либо "держать N тех же атрибутов в виде N отдельных таблиц" - первое куда лучше. Вопрос в том, что имхо и то, и другое - не очень-то хорошо.

Naug
Есть например одна большаааая табличка с данными из баланса. 200 атрибутов. Имеет смысл делать 200 таблиц, или одну с 200-ми атрибутами?
Одну.

Вопрос в том, что на другую таблицу, с проводками, надо использовать другую отчетную таблицу, а не ту же, что и "балансовые разделы отчетов".

NaugСпаибо насчёт информации о скорости работы - я раньше не сталкивался с такими объёмами данных чтобы структура принципиально влияла на производительность, но всё таки что лучше - 200 маленьких запросов на insert, или один большой. (Конечно при условии что этот большой вообще выполним.
Я очень затрудняюсь представить себе условия, при которых двести будут лучше. Если замерить варианты - почти уверен, что "двести маленьких" окажется в среднем раз в сто хуже.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027629
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВот этого не понял.

Каждый запрос идет к одному разделу. Отчет состоит из серии разделов, то есть из серии запросов, каждый к своему разделу. Наоборот, SQL упрощается, поскольку не требуется дополнительно каждый раз фильтровать большую таблицу по "нужны данные N-го типа раздела".

Сейчас запрос одного раздела для определённой организации и даты , в первом варианте выглядит так -
Код: plaintext
Select field1 from Table where orgID='x' and date='y';
Во втором так -
Код: plaintext
Select field from Table1 where orgID='x' and date='y';;

То есть разница не принципиальна + во втором варианте мы экономим место на потенциально пустые разделы, можем лучше использовать индексы и тд и тп.

Однако если нужно отобрать одно поле для отчёта по нескольким другим (например определённую характеристику для всех компаний со статусом "хороший клиент" выглядеть это в первом варианте будет так
Код: plaintext
Select field1 from Table where field2='z';
Во втором так -
Код: plaintext
Select field from Table1 where orgID in (select orgID from table2 where field='z') and date in (select date from table2 where field='z') ;
О том как будет выглядеть запрос где отбор производится по 3-м критериям мне думать страшно (а руки делают)
Ну, естессно так как в полях длинные куски текста то будет не =, а Like но это уже детали. С введением сурогатного ключа запос упростится, но всё равно будет как минимум один вложенный запрос.

Вот такое соображение - или я неправильно запрос составил?

авторНе понял. Если Вы имеете в виду "держать N атрибутов в одной таблице" либо "держать N тех же атрибутов в виде N отдельных таблиц" - первое куда лучше. Вопрос в том, что имхо и то, и другое - не очень-то хорошо.

не "держать N тех же атрибутов в виде N отдельных таблиц", а держать каждый из N тех же атрибутов в N отдельных таблиц. Но в остальном именно так. А как со стороны выглядела система описанная мной? И какой паттерн хранения применили бы ВЫ?
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33027649
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВопрос в том, что на другую таблицу, с проводками, надо использовать другую отчетную таблицу, а не ту же, что и "балансовые разделы отчетов".А, я просто не въехал в слово "проводка" - это часть отчёта такая? То есть если я правильно понял Вы бы разбили мою большую таблицу на несколько меньших где атрибуты схожи "по смыслу" - вполне допускаю, в принципе сейчас у меня две таблицы - баланс и "остальное", проблема в том имеет ли смысл дробить дальше - в "остальном" сейчас дюжина аттрибутов (но их может стать больше, хотя сомневаюсь что больше пары десятков в обозримом будущем) и провести чёткое разбиение на группы я затрудняюсь.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33028057
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaugТаблица: Report
Поля: Date, OrgId , field1,field2,field3....
(fieldN - кусок текста соответствующий одному разделу отчёта)


Я может совсем не врубаюсь в тему спора, сори, но если сделать так

Таблица: Report
Поля: Date, OrgId ,N, field
(field - кусок текста соответствующий одному разделу отчёта
N - какому разделу соответствующий)
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33028409
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naug
Сейчас запрос одного раздела для определённой организации и даты , в первом варианте выглядит так -
Код: plaintext
Select field1 from Table where orgID='x' and date='y';

Не понял. Я бы предположил, что так делается запрос "всего-всего-всего" для организации X на дату Y - всех строк всех разделов, примерно так.

Naug
Однако если нужно отобрать одно поле для отчёта по нескольким другим (например определённую характеристику для всех компаний со статусом "хороший клиент" выглядеть это в первом варианте будет так
Стоп. Я окончательно перестал Вас понимать. В таблицах лежат сохраненные данные отчетов? Или что?

В общем, сформулируйте подробнее постановку задачи.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33028456
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНе понял. Я бы предположил, что так делается запрос "всего-всего-всего" для организации X на дату Y - всех строк всех разделов, примерно так.
Мне тоже начинает казаться что мы говорим о чём-то разном. Что бы выбрать всё-всё-всё я в sql использую значёк "*", а если я указал конкретное поле значит именно его я и хочу получить.

В таблицах лежат сохранённые данные отчётов. Дилема в следующем:
1)Иметь одну таблицу с одним первичным ключём (с множеством колонок -по числу разделов в отчёте - я вовсе не складываю все данные в одну ячейку. Это - в соседней теме)

2)Иметь множество таблиц (по числу разделов в отчёте) каждая из которых состоит из первичного ключа + одной-единственной колонки в который и лежит информация об одном разделе.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33028554
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю второй вариант
только не размножать таблица

Tab1
Tab2
Tab3
....
TabN

А сделать проще добавить в таблице еще 1-но поле, раздел
Date, OrgId, data, Razdel
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33028753
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaugВ таблицах лежат сохранённые данные отчётов. Дилема в следующем:
1)Иметь одну таблицу с одним первичным ключём (с множеством колонок -по числу разделов в отчёте - я вовсе не складываю все данные в одну ячейку.
Следует ли понимать так, что в одном поле одной строки будет лежать весь "раздел"? Тогда да, одна таблица будет наиболее удобна.

Я исходил из модели, что раздел - это некая выборка, то есть N полей на K строк.
...
Рейтинг: 0 / 0
Tаблицы vs. Атрибуты
    #33028902
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, один раздел в данном случае это кусок данных компактно лежащих под определённым заголовком и разбить его на части нельзя.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Tаблицы vs. Атрибуты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]