|
|
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Hi all. Задача, в таблице хранится набор записей(карточек, карточки могут быть разного типа), каждая карточка имеет свои атрибуты, каждый атрибут соответственно может иметь значение. Всё это хозяйство можно хранить двумя способами: 1) Сделать одну большую таблицу, соответственно атрибуты будут создаваться как столбцы таблицы, соответственно если много атрибутов, будет много столбцов(видел такую реализацию в одной системе, по сути всё хранение сущностей это одна большая таблица, в ~20000 строк и ~50 столбцов). 2) Создать отдельную таблицу для каждой сущности, т.е сделать одну таблицу для карточек, одну таблицу в которой лежат все атрибуты и таблицу значений атрибутов(т.е получается связь м/у таблицей карточек и таблицей атрибутов типа "много-ко-многим") Интересует следующий вопрос в каком случае данные хранятся и обрабатываются эффективней? Когда учился на курсах по sql, препод сказал что первый вариант значительно эффективней по скорости, так как там одна плоская таблица. P.S. сервер: SQL Server 2005 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2010, 14:17 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
I dont knowкаждая карточка имеет свои атрибутыСуществует ли в Вашей задаче такое понятие как "тип карточки"? (например, карточки первого типа имеют такой-то набор атрибутов, карточки второго типа - такой-то набор и т.д.) Если да, то конечен ли перечень типов карточек? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2010, 15:14 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Еще неплохо бы выяснить, карточки у вас это совершенно несвязанные друг с другом объекты, либо по каких то их общим характеристикам будет собираться статистика, будут строиться индексы, суммирование по каким либо полям? Современные СУБД достаточно неплохо сжимают таблицы, большинство полей в которых пустые. Если у нас несколько типов карточек с существенно разным количеством атрибутов, можно создать по таблице для каждого типа. Создание таблицы со списком атрибутов ИМХО оправдано лишь там, где записей немного, скорость не критична и типы полей не принципиальны. Скажем, у нас это используется для ведения дополнительных атрибутов компаний в зависимости от их страны, потому что у каждой страны как правило свой набор классификаторов и атрибутов для юр. лиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2010, 15:42 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Паганель, Да, типы карточек есть, например есть карточка типа "Входящий документ" и "Исходящий документ"(немного различаются набором атрибутов), и набор типов ограничен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2010, 17:35 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
OrtogonЕще неплохо бы выяснить, карточки у вас это совершенно несвязанные друг с другом объекты, либо по каких то их общим характеристикам будет собираться статистика, будут строиться индексы, суммирование по каким либо полям? В принципе да, можно собирать статистику(скажем сделать отчёт по карточкам - выбрать все документы поступившие с 10 по 20 число). Например система хранит сканобразы документов, при добавлении документа в систему, создается его карточка с полями, и к этой карточке прикрепляется документ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2010, 17:40 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Рекомендую рассмотреть (как вариант) решение "под каждый тип карточек - отдельную таблицу" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2010, 18:03 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Паганель, Т.е как я понял, лепить всё в одну таблицу не очень эффективно и лучше этого не делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2010, 21:19 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
I dont know Т.е как я понял, лепить всё в одну таблицу не очень эффективно и лучше этого не делать?Эффективно понятие растяжимое. Эффективное в одном, будет жутко неэффективно в другом. Бесплатных пирожных не бывает. Вы должны для себя определить параметры оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 06:10 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
SERG1257, Немного конкретизирую: Под эффективностью будем понимать скорость работы. Меня интересует какой из вариантов будет работать быстрее, и похоже что оба варианта если не равнозначны, то близки, всё зависит от оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 08:15 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
I dont know Под эффективностью будем понимать скорость работы.Чорт. Скорость чего: чтения, вставки, обновления, удаления, сопровождения Паганель Рекомендую рассмотреть (как вариант) решение "под каждый тип карточек - отдельную таблицу"+1 Самый простой вариант, особенно при набор типов ограничен . Плюс вьюха с union all как все карточки итого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 08:52 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
SERG1257 Чорт. Скорость чего: чтения, вставки, обновления, удаления, сопровождения Скорость работы с этой базой, т.е важна скорость чтения, записи и обновления ПаганельРекомендую рассмотреть (как вариант) решение "под каждый тип карточек - отдельную таблицу" Зачем делать под каждый тип свою таблицу, может лучше будет сделать одну таблицу с полем ТИП? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 09:57 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
I dont know Зачем делать под каждый тип свою таблицу, может лучше будет сделать одну таблицу с полем ТИП? Для большей общности исследованных вариантов рассмотрите случай одна таблица, одно поле. Т.е. в это поле типа в неформатированном виде все запихать, в надежде, что доставть не придется. А если придется, то будет в общем случае еще сложнее чем из одной таблицы, т.е. поинтеречснее будет щзадачки возникать в ЖЗ такой БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 10:37 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
I dont knowЗачем делать под каждый тип свою таблицу, может лучше будет сделать одну таблицу с полем ТИП? Если в одном типе заполняются три поля, а в другом три десятка, разделение их на разные таблицы все же экономит место. Еще надо подумать о том, сколько методов обработки данных у вас относится ко всем типам и сколько к каждому конкретному, но неприменимо к другим. Если практически все методы общие, а у вас несколько таблиц, то придется дублировать их для каждой таблицы, либо пользоваться обобщенными переменными, это может вызвать некоторые трудности. Если же у вас таблица одна, а методы наоборот, зависят от типа, придется писать кейсы, дополнительные проверки, которые можно было бы вынести на уровень таблиц, будь их несколько на каждый тип. То есть все зависит от вашей специфики предметной области. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 10:49 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Ответьте себе на вопрос, как часто будут у вас появляться новые типы карточек и их новые атрибуты. Если часто, то имеет смысл еще почитать про EAV, чтобы знать что есть и третий вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 11:05 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
stiОтветьте себе на вопрос, как часто будут у вас появляться новые типы карточек и их новые атрибуты. Если часто, то имеет смысл еще почитать про EAV, чтобы знать что есть и третий вариант. EAV это фактически то, что топикстартер предложил с самого начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 13:48 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Еще один вариант пришел в голову, по типу как в SAP HR инфа о сотрудниках хранится. Там атрибуты сотрудника сгруппированы по областям - инфотипам, и каждый инфотип в своей таблице расположен. ID сотрудника во всех таблицах один. То есть можно для каждого типа карточки определить, нужно ли заполнять конкретную табличку, или нет. Для каждого инфотипа есть свои методы. Легче разграничивать доступ к разным инфотипам. Если есть необходимость добавить атрибут в инфотип, быстрее сделать редизайн таблицы, в которой меньше полей и записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 15:54 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
I dont know Скорость работы с этой базой, т.е важна скорость чтения, записи и обновленияТо есть вы не понимаете, что это противоречивые требования. I dont know видел такую реализацию в одной системе, по сути всё хранение сущностей это одна большая таблица, в ~20000 строк и ~50 столбцовПри таких объемах вся база ухнет в память и затачивать бесполезно, ибо померить разницу в скорости будет сложно. Ortogon Если в одном типе заполняются три поля, а в другом три десятка, разделение их на разные таблицы все же экономит место. Нет, не экономит. sti то имеет смысл еще почитать про EAV, чтобы знать что есть и третий вариант.Ага особенно про недостатки этого убожества. IMHO здесь явно видна ошибка проектирования - начата разработка физической модели, пока не проработана логическая. Поскольку речь вряд ли идет о гигантских объемах, дикой конкуренции или жесточайших требований ко времени отклика (то есть областях где применение финтов имеет смысл) имеет смысл рисовать простые и понятные модели, которые будет легко оптимизировать и поддерживать. Короче несколько аксиом без применения к топик стартеру KISS - будь проще и люди к тебе потянутся отделяй мух от котлет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 16:50 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
SERG1257I dont know Скорость работы с этой базой, т.е важна скорость чтения, записи и обновленияТо есть вы не понимаете, что это противоречивые требования. Ну, вряд ли ТС собирается строить множество могутых индексов в разрезе десятков измерений, которые тормозят запись и облегчают поиск и суммирование. Тут скорее противопоставление общей скорости работы базы ее размеру и простоте саппорта. SERG1257Ortogon Если в одном типе заполняются три поля, а в другом три десятка, разделение их на разные таблицы все же экономит место. Нет, не экономит. А вот тут можно поподробнее? Все никак не соберусь проверить это. Когда то давно проверял, на msSql2k, но там процентов 10-15 объема можно было выиграть. На современных серваках не пробовал, наверное действительно уже без разницы. SERG1257sti то имеет смысл еще почитать про EAV, чтобы знать что есть и третий вариант.Ага особенно про недостатки этого убожества. Уж очень категорично. Эта схема применяется в серьезных коммерческих продуктах, там, где она уместна. Например, там где нужна настройка атрибутов без привлечения разработчика и количество записей не превышает нескольких сотен. SERG1257Поскольку речь вряд ли идет о гигантских объемах, дикой конкуренции или жесточайших требований ко времени отклика (то есть областях где применение финтов имеет смысл) имеет смысл рисовать простые и понятные модели, которые будет легко оптимизировать и поддерживать. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 18:18 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Ortogon Тут скорее противопоставление общей скорости работы базы ее размеру и простоте саппорта.Скорее топикстартер не совсем понимает принципы оптимизации. Особенно мне понравилась фраза про первый вариант значительно эффективней по скорости без анализа данных и требований. Ortogon А вот тут можно поподробнее? Все никак не соберусь проверить это. Когда то давно проверял, на msSql2k, но там процентов 10-15 объема можно было выиграть. На современных серваках не пробовал, наверное действительно уже без разницы.Аналогично давно сам не проверял, с пустыми полями немного другая закавыка, если оно может обновляться - надо оставлять свободное место под рост и тут чем больше пустых полей тем больший резерв или бороться с расщепленными строками. Но это уже другая история Ortogon Эта схема применяется в серьезных коммерческих продуктах, там, где она уместна.Даже применение в самых серьезных продуктах не делает это приличной вещью. У меня с EAV личные счеты, сначала это затевалось как маленький дополнительный словарь, затем объем рос, данные стали представлять самоценность, повысились требования к времени отклика, я пытался подточить и я понял что это не лечится никак, кроме как созданием и поддержкой параллельной нормальной таблицы и перенаправлением запросов на нее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2010, 04:07 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
Если делать одну таблицу - предполагаю что на ней будет много разных индексов, в таком случае обновление такой таблицы будет идти медленнее именно из-за необходимости перестройки индексов, по сравнению с несколькими таблицами, ведь некоторые из этих таблиц это справочники, которые очень редко обновляются. Это во первых. Во вторых чтение с диска производится страницами (имеются ввиду страницы базы) и если таблица одна, то в память при чтении будет читаться больше данных чем в случае с несколькими таблицами, ведь не всегда требуются данные из всех связанных таблиц, а в случае одной таблицы вся запись будет читаться в любом случае, т.е. возможно неэффективное использование ресурсов. Опять таки сжатие данных поддерживают не все СУБД, в некоторых его надо дополнительно включать для конкретных таблиц. Для широких таблиц (т.е. если у них много полей) встает вопрос правильного выбора размера страницы - если запись не влезет в одну страницу, то возможен вариант когда одна запись располагается в нескольких страницах которые лежат непоследовательно - получаем дополнительную нагрузку IO и низкую скорость поиска данных на диске. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2010, 08:47 |
|
||
|
Всё в одной таблице или разбить... как будет эффективней?
|
|||
|---|---|---|---|
|
#18+
AndronЕсли делать одну таблицу - предполагаю что на ней будет много разных индексов, в таком случае обновление такой таблицы будет идти медленнее именно из-за необходимости перестройки индексов, по сравнению с несколькими таблицами, ведь некоторые из этих таблиц это справочники, которые очень редко обновляются. Это во первых. Во вторых чтение с диска производится страницами (имеются ввиду страницы базы) и если таблица одна, то в память при чтении будет читаться больше данных чем в случае с несколькими таблицами, ведь не всегда требуются данные из всех связанных таблиц, а в случае одной таблицы вся запись будет читаться в любом случае, т.е. возможно неэффективное использование ресурсов. Опять таки сжатие данных поддерживают не все СУБД, в некоторых его надо дополнительно включать для конкретных таблиц. Для широких таблиц (т.е. если у них много полей) встает вопрос правильного выбора размера страницы - если запись не влезет в одну страницу, то возможен вариант когда одна запись располагается в нескольких страницах которые лежат непоследовательно - получаем дополнительную нагрузку IO и низкую скорость поиска данных на диске. Спасибо, примерно это я и хотел услышать, то что надо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2010, 11:56 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36787672&tid=1542589]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 483ms |

| 0 / 0 |
