|
|
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые! Имею таблицу в MySQL, где приходится некоему объекту постоянно расширять свойства и в связи с этим растет количество полей. Уже становится трудно ориентироваться и просматривать записи в этой таблице. Как быть? Есть пути оптимизации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 09:25 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
b10s, уйти от "горизонтального" справочника к вертикальному. Т.е. делаете к основной таблице следующую структуру (упрощенно): авторEntity_Params --------------------- Param_ID Name Params_Value --------------------- ID SourceTable_ID Param_ID Value Недавно приходилось ровно такой процесс делать на базе, т.к. изначально разработчики "растили" таблицу вширь, доведя размер ряда до неприличных значений. При необходимости, можно так же внести в Entity_Params дополнительные столбцы, контролирующие тип параметров, дефолтные значения, краевые условия и т.п. Из основных плюсов - дальнейшее увеличение количества параметров сущности совершенно не требует изменения табличной структуры, так же можно по дефолту прописать базовые неизменяемые запросы по выборке всех параметров сущности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 09:50 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
второй подход, так же практикуемый в нашей базе, но мне менее симпатичен - формировать таблицу расширений, с условием связи 1-1 к основной, в которую будете выносить дополнительные параметры. Т.е. поулчается две таблицы: авторSource ---------------- ID Param1 Param2 .......... Param(n) Sorce_Extension ---------------- Source_ID Param(n+1) Param(n+2) .............. Param(n+k) Параметры при этом можно разбить по смысловой нагрузке и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 09:53 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
b10sЗдравствуйте, уважаемые! Имею таблицу в MySQL, где приходится некоему объекту постоянно расширять свойства и в связи с этим растет количество полей. Уже становится трудно ориентироваться и просматривать записи в этой таблице. Как быть? Есть пути оптимизации? например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 10:04 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
b10sЗдравствуйте, уважаемые! Имею таблицу в MySQL, где приходится некоему объекту постоянно расширять свойства и в связи с этим растет количество полей. Уже становится трудно ориентироваться и просматривать записи в этой таблице. Как быть? Есть пути оптимизации? тут нет провода для о оптимизации пока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 10:39 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
MasterZiv, почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 13:22 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
b10sMasterZiv, почему?Когда говорят о базах данных, в 99% случаев под "оптимизацией" по умолчанию понимают оптимизацию производительности. У вас с ней проблем пока нет (ну или вы про них не пишете). Потому и повода нет. Вы пишете об оптимизации процесса разработки, что вам якобы "неудобно" (дайте угадаю - поля таблицы не влезают на экран, если написать "select * from mytable"?). Это, имхо, вопрос привычки. Со временем привыкнете выбирать из таблицы те столбцы, которые действительно нужны. У нас, например, одна таблица есть с почти 300 полями, и ничего, живем как-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 13:37 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
MasterZivb10sЗдравствуйте, уважаемые! Имею таблицу в MySQL, где приходится некоему объекту постоянно расширять свойства и в связи с этим растет количество полей. Уже становится трудно ориентироваться и просматривать записи в этой таблице. Как быть? Есть пути оптимизации? тут нет провода для о оптимизации пока. Я бы уточнил "пока суммарная возможная длинна полей не превышает лимита". Для сайбеза со страницей 2к это не так много (~1962 по-моему байт), что очень быстро выедается полями по типу "Comments varchar(150)" =) А в целом затея ТС - на мой взгляд более чем правильная - бесконечно расширять таблицу - ИМХО вред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 13:39 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
У нас таблицы и формы строились генератором по нашему мета-описанию. Полей могло быть много, могло быть много пустых и иногда даже не используемых. Через SELECT * на данные обычно смотреть было нужно только в контексте - вернул запрос данные, какое кол-во. Собственно с данными работали через свое приложение и кол-во полей было пофиг. А для обработки данных: пару-тройку нужных полей и вперед. Или, что правильнее, SELECT в отдельную таблицу, обработали, проверили, влили в пром. базу. Mikle83Я бы уточнил "пока суммарная возможная длинна полей не превышает лимита".... My SQL: http://dev.mysql.com/doc/refman/4.1/en/column-count-limit.html There is a hard limit of 4096 columns per table MS SQL: http://msdn.microsoft.com/en-us/library/ms143432(v=sql.110).aspx Columns per nonwide table: 1,024 Columns per wide table: 30,000 Oracle ссылки под рукой нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 14:17 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, речь не про количество колонок а про общую "длинну" данных в одном ряду (исключая BLOB, которые могут в OutRow уйти) К примеру для сайбеза ASE: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc35823.1572/doc/html/san1334282764922.html Встречал подобные ограничения и на других СУБД. Если данные превышают указанный лимит => будет ексепшен. Как дело обстоит на указанных вами СУБД - не могу сказать. Подходы могут быть разные, но если какой-то атрибут встречается, к примеру, у 10% записей "городить" для всей таблицы дополнительное поле? На вкус и цвет как говорится. Можно так же контекстно зависимые поля сделать, но сопровождение такой структуры мягко сказать не облегчается... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:18 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Mikle83второй подход, так же практикуемый в нашей базе, но мне менее симпатичен - .... Да уж. Симпатичное в таких подходах, скорей всего, не кажный найдет. Не кажный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:30 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
vadiminfoMikle83второй подход, так же практикуемый в нашей базе, но мне менее симпатичен - .... Да уж. Симпатичное в таких подходах, скорей всего, не кажный найдет. Не кажный. Меж тем уже неоднократно и не в одной БД (разные конторы) встречал подобные "решения", а также яростных защитников такого подхода, в большинстве случаев оперирующих всего одной парадигмой: "прямой селект, без заморочек, достаточно только джойна екстеншена". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:38 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Mikle83, Если проблема только в том, что поля не умещаются на страницу данных - то таблица-дополнение с отношением 1:1, конечно, предпочтительнее EAV ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:56 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
b10sИмею таблицу в MySQL, где приходится некоему объекту постоянно расширять свойства и в связи с этим растет количество полей. Уже становится трудно ориентироваться и просматривать записи в этой таблице. Как быть? Есть пути оптимизации? Если все эти поля действительно описывают объект, а проблема только в удобстве просмотра, то надо сделать удобный просмотр, показывающий атрибуты по группам. PageControls, деревья, и все такое, а не просто дефолтовый грид. Но, кроме этого, если полей действительно много, и они постоянно расширяются, это может косвенно свидетельствовать об ошибке проектирования. Тогда, возможно, надо делить их на отдельные таблицы, а в крайнем случае и до EAV дело дойдет. Только не думайте, что EAV из трехсот параметров будет чем-то удобнее и нагляднее, чем дефолтовый грид. Опять же встанет вопрос нормального просмотрщика. Это мы не говорим о возможных физических ограничениях, это еще отдельный вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 18:00 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
b10sMasterZiv, почему? Потому что само по себе большое количество полей в таблице не является ни проблемой проектирования БД, ни неоптимальным решением с точки зрения производительности работы БД. Как правило, в OLTP приложениях, широкие таблицы (с большим кол-вом полей) -- это признак плохого проектирования БД, но для того, чтобы в этом разобраться, нужно знать исходное техзадание и структуру получившейся БД. Ну и просто пополнение состава полей таблицы -- это также нормальное явление , ничего страшного тут нет (если со структурой БД всё в порядке, естественно). А уж "становится трудно ориентироваться и просматривать записи в этой таблице" -- это вообще детский лепет какой-то. Это -- твои личные трудности, трудно ориентироваться -- пиши документацию на таблицы, делай модели во всяких CASE, трудно просматривать -- пиши запросы не со всеми полями, а только с теми, которые нужны, и/или используй более удобные средства просмотра результатов запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 19:28 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Mikle83MasterZivпропущено... тут нет провода для о оптимизации пока. Я бы уточнил "пока суммарная возможная длинна полей не превышает лимита". Для сайбеза со страницей 2к это не так много (~1962 по-моему байт), что очень быстро выедается полями по типу "Comments varchar(150)" =) А в целом затея ТС - на мой взгляд более чем правильная - бесконечно расширять таблицу - ИМХО вред. Проблема в любом случае не в большом кол-ве полей, а в неграмотном проектировании структуры БД. Первое само по себе -- не криминал. Отсутствие второго почти всегда даёт "узкие" таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 19:30 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Mikle83vadiminfoпропущено... Да уж. Симпатичное в таких подходах, скорей всего, не кажный найдет. Не кажный. Меж тем уже неоднократно и не в одной БД (разные конторы) встречал подобные "решения", а также яростных защитников такого подхода, в большинстве случаев оперирующих всего одной парадигмой: "прямой селект, без заморочек, достаточно только джойна екстеншена". Ничего плохого в таком подходе и правда нет, если это только для обхода физического ограничения на ширину записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 19:32 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Mikle83 , а также яростных защитников такого подхода, ... Могу предположить, что эти достойные всякого рода подражания в области защиты чего-либо люди, яростно клеймили "теоретиков". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 23:49 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
MasterZivMikle83пропущено... Меж тем уже неоднократно и не в одной БД (разные конторы) встречал подобные "решения", а также яростных защитников такого подхода, в большинстве случаев оперирующих всего одной парадигмой: "прямой селект, без заморочек, достаточно только джойна екстеншена". Ничего плохого в таком подходе и правда нет, если это только для обхода физического ограничения на ширину записи. Мне не нравится с точки зрения хранения данных подход. К примеру, имеем ограничение в 1962 байта на страницу. Таблица разделяется на две, условно по ~1700 байт в каждой на ряд. Итого (без учета служебной инфы приблизительный расчет) 1962-1700 = 262 байта на каждой странице "подвисает" неиспользуемыми. Если у нас под сотню миллионов строк 262 * 100 000 000 = 26 200 000 000 байта ~ 24.4 Гб "лишнего" места. Хранение в вертикальном справочнике все-таки более экономно... Можно конечно и в горизонтальных таблицах распределить поля более грамотно, но из опыта => на это слабо обращают внимание =) Хотя оборотная сторона медали - чтение данных из "вертикальной" таблицы по одному идентификатору в общем случае может быть более "дорогостоящим" и ресурсоемким - но тут надо в каждой конкретной задаче искать "баланс". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 10:29 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
А чаще первая таблица забивается "под завязку" по длине строки, а во вторая набивается все, что не влезло в первую. И длина строки во второй немногим больше размера страницы / 2 - вот тут совсем забавные ситуации =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 10:33 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Mikle83Итого (без учета служебной инфы приблизительный расчет) 1962-1700 = 262 байта на каждой странице "подвисает" неиспользуемыми. Если у нас под сотню миллионов строк 262 * 100 000 000 = 26 200 000 000 байта ~ 24.4 Гб "лишнего" места. Хранение в вертикальном справочнике все-таки более экономно... Да ну? в EAV у Вас на одно "смысловое" поле минимум 2 "служебных" - ID_Object, ID_Attribute. не считая пары индексов по этим полям. Чтобы 100 полей в "плоской" таблице занимали больше места, чем те же 100 полей в EAV - это вряд ли. У EAV есть ровно одно (правда, немаленькое) преимущество - возможность добавления атрибутов "на лету". Во всем остальном она проигрывает "плоским" таблицам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 11:14 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин У EAV есть ровно одно (правда, немаленькое) преимущество - возможность добавления атрибутов "на лету". Потому что теперь они в рамках РМД и не атрибуты вовсе, а данные. Атрибуты теперь ID_Object, ID_Attribute. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 11:29 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин Да ну? в EAV у Вас на одно "смысловое" поле минимум 2 "служебных" - ID_Object, ID_Attribute. не считая пары индексов по этим полям. Оба идентификатора int-овые => 8 байт дополнительно надо на одно "смысловое" поле. Ранее было получено "лишние" 262 байта на каждой странице. Итого 262 / 8 = 32 идентификатора можно разместить. Т.е. 1700 байт распределяются - под 32 "смысловых" поля. Средняя длинна "смыслового" поля при этом 53 байта. Если каждая ваша строка содержит всего 20 "смысловых" полей по 50 байт. Общий их объем 1000 байт - соответственно 1 страница под одну запись. В вертикальном же справочнике - у вас 32 поля на одну страницу, т.е. чуть больше, чем полторы записи. Тут очень упрощенно привел расчеты. Но в реальности был пример, когда вертикальный справочник "сжал" объем данных. Еще раз отмечу - в любом подходе требуется баланс и оценка выполняемого действия со всех возможных сторон. P.S.: индексы вообще в расчет не беру, т.к. специфика может быть такая, что на каждое поле плоской таблицы потребуется индекс навесить... Слишком абстрактная задача - обсуждать индексы на абстрактных EAV и плоских структурах... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 11:30 |
|
||
|
Разрастается количество полей в таблице
|
|||
|---|---|---|---|
|
#18+
On 24.06.2014 11:29, Mikle83 wrote: > Итого (без учета служебной инфы приблизительный расчет) 1962-1700 = 262 > байта на каждой странице "подвисает" неиспользуемыми. > Если у нас под сотню миллионов строк 262 * 100 000 000 = 26 200 000 000 > байта ~ 24.4 Гб "лишнего" места. Э... ты переоптимизатор. Во-первых, в реальной жизни записи все переменной длины, а твой расчёт построен на максимальной длине записи. Во-вторых, если действительно будет надо делать такую широкую таблицу, то деваться-то некуда, других вариантов решения проблемы и нет. > Хранение в вертикальном справочнике все-таки более экономно... > Можно конечно и в горизонтальных таблицах распределить поля более > грамотно, но из опыта => на это слабо обращают внимание =) Обращать надо. Но главное -- EAV не везде подходит. > Хотя оборотная сторона медали - чтение данных из "вертикальной" таблицы > по одному идентификатору в общем случае может быть более "дорогостоящим" > и ресурсоемким - но тут надо в каждой конкретной задаче искать "баланс". Вот именно. К тому же далеко не все подход EAV приемлют, например, все современные модные ORM с ним превращаются в пшик. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 12:59 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=28&tid=1540857]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
53ms |
get forum data: |
2ms |
get page messages: |
113ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 471ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...