Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Ситуация: Есть база данных, в которую сериализуются объекты различных типов из .NET-овского клиента. Между объектами могут существовать различные отношения - наследование, агрегирование и т.п. Наследование на уровне базы данных реализовано при помощи отношения один-к-одному. Уровней иерархии наследования в среднем 2-3. У всех объектов существует общий предок. Типов объектов достаточно много (несколько десятков, в перспективе до сотни-двух), соответственно столько и отношений один-к-одному к таблице, хранящей информацию о самых базовых объектах. Вопросы: Насколько будет замедляеться вставка в таблицу, при возрастании количества отношений один-к-одному к ней? Насколько быстро выполняется выборка из таблиц, связанных по ключу при отношении один-к-одному (скажем по отношению к один-ко-многим - также, быстрее, медленнее)? Насколько серьезно все это будет тормозить при возрастании количества данных? Интересует опыт людей, работавших с аналогичными структурами данных, субъективная оценка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 20:28 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
VladiChТипов объектов достаточно много (несколько десятков, в перспективе до сотни-двух), Ну и не дурили бы народу мозги и сказали бы КЛАСС, а не объкт, потом тип объектов.... VladiCh Вопросы: Насколько будет замедляеться вставка в таблицу, при возрастании количества отношений один-к-одному к ней? Насколько быстро выполняется выборка из таблиц, связанных по ключу при отношении один-к-одному (скажем по отношению к один-ко-многим - также, быстрее, медленнее)? Насколько серьезно все это будет тормозить при возрастании количества данных? 1. Смотря куда?? Если есть отношение Автомобиль-ЛегковойАвтомобиль-Волга, то при вставке в таблицу Автомобиль, вообще не зависит от кол-ва потомков. Если в ЛегковойАвтомобиль, то зависит от кол-ва записей в таблице Автомобиль, хотя не на много, т.к. проверка идет по индексу. Если в табл. Волга, то то зависит от кол-ва записей в таблице ЛегковойАвтомобиль, хотя не на много, т.к. проверка идет по индексу. 2. Теоретически быстрее чем один-ко-многим, хотя это скорее всего зависит от кол-ва связываемых таблиц. 3. Любая БД на тестовых небольших данных показывает наилучшую производительность, чем при больших данных. Все зависит от запросов, проверок, вставок, и индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 14:32 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
basНу и не дурили бы народу мозги и сказали бы КЛАСС, а не объкт, потом тип объектов.... Дело в том, что класс в этой системе тоже является объектом, поэтому устоялась терминология - объект и тип. Информация о всех типах объектов и их атрибутах (метаданные) описана в этой же базе данных рекурсивно, т.е. эти описания также являются объектами системы. Отношения примерно такие: Объект - Автомобиль - Легковой автомобиль - Волга То есь при добавлении любого объекта обязательна вставка в таблицу "Объект". Соответственно в этой таблице записей будет столько же, сколько в системе объектов (теоретически могут быть сотни тысяч - миллионы объектов). При добавлении новой "Волги" прийдется вставлять данные в 4 таблицы. Соответственно при выборке всех "Волг" придется связывать 4 таблицы. Запросы на выборку, вставку и т.п. генерируются автоматически на основании метаданных. То есть это что-то типа небольшой ORM-системы. basТеоретически быстрее чем один-ко-многим, хотя это скорее всего зависит от кол-ва связываемых таблиц. Насколько быстрее и за счет чего? basЛюбая БД на тестовых небольших данных показывает наилучшую производительность, чем при больших данных. Все зависит от запросов, проверок, вставок, и индексов Это понятно, поэтому и интересует опыт людей, делавших что-то подобное. Понятно, что это все зависит от запросов, но хотя бы в первом приближении, можно ли оценить так сказать скорость замедления работы при увеличении количества объектов и/или типов объектов в системе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 14:54 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Как предполагается работа с наборами объектов? 1 вариант: select * from Objects o join Automobiles a on a.ID = o.ID where a.WhealsCount = 4 2 вариант: while(true) { Automobile auto = Automobile() auto.Serialize() if auto.WhealsCount = 4 { ... } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 15:37 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
VladiChСитуация: Есть база данных, в которую сериализуются объекты различных типов из .NET-овского клиента. Между объектами могут существовать различные отношения - наследование, агрегирование и т.п. Наследование на уровне базы данных реализовано при помощи отношения один-к-одному. Уровней иерархии наследования в среднем 2-3. У всех объектов существует общий предок. Типов объектов достаточно много (несколько десятков, в перспективе до сотни-двух), соответственно столько и отношений один-к-одному к таблице, хранящей информацию о самых базовых объектах. Вопросы: Насколько будет замедляеться вставка в таблицу, при возрастании количества отношений один-к-одному к ней? Насколько быстро выполняется выборка из таблиц, связанных по ключу при отношении один-к-одному (скажем по отношению к один-ко-многим - также, быстрее, медленнее)? Насколько серьезно все это будет тормозить при возрастании количества данных? Интересует опыт людей, работавших с аналогичными структурами данных, субъективная оценка. Эх, а ведь именно для таких случаев могут оказаться полезны объектные СУБД. И именно проблему быстродействия при вставке в таблицы, связанные gj ключу, мы исследовали при сравнении ООСУБД Versant FastObjects с Sybase и Oracle в этой ветке. Основываясь на полученных результатах, можно заметить, что в описанных в вопросе условиях торможение будет весьма существенным, особенно при больших (более 2-3 Гб или более 2-3 млн. записей) объемах данных. Единственный способ борьбы - отключение констрейнтов и индексов. Цена вопроса - порядки (т.е. быстродействие может изменяться на несколько порядков). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:31 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Есть прототип языка запросов, в котором можно задавать фильтры, т.е. что-то типа "Automobiles:WhealsCount = 4", это в результате разворачивается в вариант 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:31 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Но в таком случае заковыристых запросов не написать, только простые, остальные буду в апликейшн-сервере обрабатываться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:35 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
VladiCh Отношения примерно такие: Объект - Автомобиль - Легковой автомобиль - Волга То есь при добавлении любого объекта обязательна вставка в таблицу "Объект". Соответственно в этой таблице записей будет столько же, сколько в системе объектов (теоретически могут быть сотни тысяч - миллионы объектов). При добавлении новой "Волги" прийдется вставлять данные в 4 таблицы. Соответственно при выборке всех "Волг" придется связывать 4 таблицы. Запросы на выборку, вставку и т.п. генерируются автоматически на основании метаданных. То есть это что-то типа небольшой ORM-системы. Вставка - это самая быстрая операция в БД, при отключении всех тригеров и ограничений, т.е. если Вы будите это все отслеживать логически, то лучше в последствии отключить все констрейны и тормозов не должно быть при любом кол-ве данных, и индексов должно быть только самые необходимые. Т.е. то что Вы получите на тестирование, от и должно быть и с большим кол-вом данных. VladiCh basТеоретически быстрее чем один-ко-многим, хотя это скорее всего зависит от кол-ва связываемых таблиц. Насколько быстрее и за счет чего? Ну хотя бы потому, что один ко многим предусматривет бОльшее кол-во данных в подчиненной таблце, поэтому меньше данных, меньше время исполнения запроса. Но это теоретически, на практике все зависит от конкретной ситуации. VladiCh Понятно, что это все зависит от запросов, но хотя бы в первом приближении, можно ли оценить так сказать скорость замедления работы при увеличении количества объектов и/или типов объектов в системе? А че Вы не можите предусмотреть какие понадобятся запросы к БД, вот все их проанализируйте и поймете во сколько раз будут тормоза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:36 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
В плане опыта могу сказать вот что: таблицу общего предка побейте для создания partitioned view(mssql) или partitioned table(oracle) так как там будет оооочень большое kоличество записей. Бить ее лучше прямо по ID, причем порциями сначала линейновозрастающими, потом как удобно. Например, пусть в первой порции мы хотим держать какие-либо метаданные которые часто используются (объекты типа класс, константы...) разумно эти данные поместить в первую партицию и под эту порцию выделить ID c 1 по 1000, другие партиции по усмотрению. Если в качестве первичного ключа вы используете GUID то для таблицы единого предка сделайте составной первичный ключ ID,GUID , в этом случае все потомки также будут содержать ID и GUID, но для внешних связей использовать только GUID (как альтернативный ключ). ID в данном случае нам нужен только чтоб побить общего предка (ID в данном случае может быть не уникальным), а возможно и потомков на партиции. Дальнейшие опасения в плане времени на CRUD операции решаются советами с DBA, так можно посоветовать например разнести таблицы, индексы по различным файловым группам/tablespace, использовать distributed partitions ... P/S/ Думаю вы выбрали правильную дорогу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:48 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Вообще-то в Db2 подобная проблема решена очень давно с использованием структурных типов и типизированных таблиц. Например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:58 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
У нас в таблице базовых объектов было полмиллиона записей с кластерным ключем по идентификатору. Проблем с производительностью не было никаких ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 16:58 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
2Old Nick Так язык запросов и не претендует на полную универсальность. Более 90% наших потребностей он покрывает, т.е. выборки с условиями, выборки связанных объектов и т.п. Более сложные выборки можно реализовать например работая не с физическими таблицами, а используя логические - view + триггера на вставку и удаление. А то, что нельзя реализовать и так, можно действительно реализовать в сервере приложений (ну или на худой конец, расширить язык запросов, в его реализации мы никак не связаны). По поводу отключения constraint'ов и триггеров - а самому это отслеживать не дороже ли получится в плане быстродействия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 17:00 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
2Old Nick: Полмиллиона записей - не так уж и много. А количество типов объектов и средний уровень вложенности наследования какой был? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 17:02 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
2gardenman: Ну так не во всех субд подобная функциональность имеется. Конечно идеальный вариант, чтобы наследование поддерживалось на уровне СУБД, но увы, в MSSQL подобной функциональности нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 17:06 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Средний уровень вложенности наверное 3-4. Количество типов около 120. Примерно половина из них не имеет физических таблиц. -------------------- Не учи отца и баста! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 17:09 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
VladiCh2gardenman: Ну так не во всех субд подобная функциональность имеется. Конечно идеальный вариант, чтобы наследование поддерживалось на уровне СУБД, но увы, в MSSQL подобной функциональности нет. Так берите Cache и дешевле будет и веживаться не надо, ну если надо конкретно ООБД, то и надо использовать ООСУБД или СУБД, поддерживающеая ОО. А то опять велосипед получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 18:08 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
VladiCh По поводу отключения constraint'ов и триггеров - а самому это отслеживать не дороже ли получится в плане быстродействия? Я имел ввиду отключить только фориген кеи, да и то после того как логика приложения будет оттестирована и сдана в эксплуатация и нет никаких сообщений типа, связанных с ФК, вот тогда и можно отключить, и при внесении чего-то нового опять на некоторое время включить констрейны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 18:14 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
basТак берите Cache и дешевле будет и веживаться не надо, ну если надо конкретно ООБД, то и надо использовать ООСУБД или СУБД, поддерживающеая ОО. А то опять велосипед получается. У нас есть определенные требования, которые трудно реализовать существующими средствами. Например не под каждый класс заводится своя таблица, так же как похоже и у Old Nick. Данные разбиваются на 2 категории - т.н. "статические" - хранятся в текстовом виде в отдельной таблице и т.н. "динамические" - хранятся в своих таблицах. Также атрибуты объектов являются не списком, а иерархией, т.к. система предназначена в основном для хранения документов. Честно говоря не знаком с Cache, так что не знаю как там и что реализовано, но из тех ORM и OOСУБД, которые я смотрел, ничего, что можно использовать в качестве основы, серьезно не дорабатывая, не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 18:20 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Каше именно так и хранит данные, как Вы у себя проектируете, причем к ним можно получить доступ и в виде таблиц. Так что может быть действительно стоит на нее посмотреть и код можно писать на С# и на Java и еще много на чем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 18:34 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
bas VladiCh2gardenman: Ну так не во всех субд подобная функциональность имеется. Конечно идеальный вариант, чтобы наследование поддерживалось на уровне СУБД, но увы, в MSSQL подобной функциональности нет. Так берите Cache и дешевле будет и веживаться не надо, ну если надо конкретно ООБД, то и надо использовать ООСУБД или СУБД, поддерживающеая ОО. А то опять велосипед получается. нуу ООСУБД эт конечно интересно и классно но не проще ли вместо изучения новой субд и попробовать нечто среднее например Hinername (Java), NHIbernate (.NET) или другой ORM ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 19:00 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
ORM не катит, т.к. тут обратное преобразование - скорее ROM, чем ORM :) и довольно специфическое. А насчет Cache - теперь переделывать уже поздно, ядро практически уже готово и свою функцию выполняет. Да и связываться с новой СУБД не хочется, думаю на изучение ее возможностей ушло бы приличное время, да и тут всякие нетехнические моменты есть, по которым предпочтительнее MSSQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 19:11 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
VladiChORM не катит, т.к. тут обратное преобразование - скорее ROM, чем ORM :) и довольно специфическое. А насчет Cache - теперь переделывать уже поздно, ядро практически уже готово и свою функцию выполняет. Да и связываться с новой СУБД не хочется, думаю на изучение ее возможностей ушло бы приличное время, да и тут всякие нетехнические моменты есть, по которым предпочтительнее MSSQL. Может я не совсем четко отследил Вашу мысль, но поясните пожалста почему ОРМ не проходит? Насколько я понял у вас есть некая таблица в которой хранятся Oid всех сущностей используемых в системе и эта таблица связана с иными как 1-N т.е. в остальных таблицах хранятся аттрибуты этих объектов (в одной таблице может хранится несколько однотипных аттрибутов разных объектов).... так же у вас базовый класс всех сущностей представлен в этой таблице как объект и все явно или косвенно наследуются от него. Вас беспокоит так же вопрос производительности системы при расширении базовой таблицы до нескольких миллионов экземпляров объектов, но этот вопрос имхо очень хорошо прокоментировал Роман Дынник. и мне трудно найти причины, кроме уже существующего оттестированного набора процедур с реализованной в них сложной бизнес логикой, для отказа от ORM (хотя некоторые орм могут использовать и хранимые процедуры для выбора сущностей). Если я все правильно понял из вышеизложенной ветки дискуссии то поясните ваш отказ от ОРМ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 19:29 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
ORM обычно используется как порождение структуры базы данных на основе классов, здесь ситуация противоположная - существующие сущности в базе данных маппятся на классы, которые можно или автоматически генерировать или писать вручную. То есть разработка системы начинается от базы данных, а не от ее клиента. С каждым классом может быть связана своя логическая таблица (которая реально может быть и view), а может и не быть связана. Часть атрибутов объекта хранится в таблице, связанной с его типом ("динамические атрибуты"), часть в отдельной таблице, которая одна на все типы ("статические атрибуты" - как правило это текстовая информация, не участвующая в бизнес-операциях). Текстовую информацию удобно хранить таким образом, т.к. по ней производится общий поиск и легко можно выполнять различный анализ этой информации без привязки к конкретному типы объекта. Если нужна скорость вставки, то все поля объекта могут быть "динамическими" - храниться в таблице, связанной с типом объекта. Таблица, в которой хранятся OID объектов - это таблица базового типа. Таблицы дочерних типов относятся к ней 1-1. Как навешать на это все обычный OR-маппинг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 19:47 |
|
||
|
Наследование атрибутов
|
|||
|---|---|---|---|
|
#18+
Да, еще - атрибуты объекта организованы в дерево, а не простым списком, что тоже непонятно как реализовать в обычном ORM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2005, 19:51 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33207452&tid=1545694]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 389ms |

| 0 / 0 |
