Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > горизонтальное расщепление таблиц


Автор: tatan 6.11.2009, 08:57
Вопрос больше теоретический. Предположим мы пишем собственную систему управления БД.
Предусмотрено, что БД работает в некоем кластере, состоящем из минимум 3 серверов - мастер кластера, нода1, нода2, причем для балансировки нагрузки на ноды мастер кластера производит горизонтальное расщепление таблиц БД и помещает их на разные ноды. Например, в БД есть таблицы - T1, T2 ... Tn. Мастер кластера расщепил таблицы БД ровно пополам между нодами и в ноде 1 теперь
есть таблицы T1_1, T2_1 ... Tn_1 и в ноде 2 вторые половины таблиц T1_2, T2_2 ... Tn_2. Далее, мастер кластера получает произвольный запрос на выборку данных. Интересует меня:
- результаты запроса над множеством нерасщепленных таблиц равен или нет слиянию результатов запросов над расщепленными подмножествами БД.
- если не равно, есть ли разумная стратегия получения правильного результата запроса в случае расщепленных таблиц?
- можно подумать еще о том же самом в случае запроса на изменение данных.

Автор: Akina 6.11.2009, 09:31
Может, лучше почитать, как всё это организовано на распределённых БД в существующих серверах?

Цитата(tatan @  6.11.2009,  09:57 Найти цитируемый пост)
результаты запроса над множеством нерасщепленных таблиц равен или нет слиянию результатов запросов над расщепленными подмножествами БД

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

Автор: tatan 6.11.2009, 09:46
Не удалось найти описания архитектур СУБД с требуемой детализацией, с описанием алгоритмов выполнения запросов на расщепленных данных. Если укажешь пальцем где - буду благодарен.

Может неудачно объяснил - нет никакой синхронизации между нодами, ноды действуют автономно.
Вот именно, каждая нода хранит только свою часть данных.  Если результат запроса равен сумме результатов, то никаких дополнительных данных в нодах не нужно. Если нет, надо понять что необходимо дополнительно хранить на нодах и как получить консолидированный результат запроса, проведя параллельно операции запросов на нодах.



Автор: Zloxa 6.11.2009, 10:01
откуда взялись термины "расщепление", "горизонтальное"?

расщепи плиз горизонтально:
Код

ents
id
1
2

vals
id
1
2

entvals
ent_id  val_id
1       1
1       2
2       1
2       2

Автор: tatan 6.11.2009, 10:13
горизонтальное расщепление - расщепление по строкам. Вертикальное - по столбцам.
Насколько понимаю, это более-менее устоявшиеся термины. Встретить эти понятия можно например в описании функция распределенных СУБД, например здесь http://mrivkin.narod.ru/Publ/RASPBD.htm

Автор: Zloxa 6.11.2009, 10:32
Цитата(tatan @  6.11.2009,  10:13 Найти цитируемый пост)
здесь 

Это был как бы намек поискать ответы на вопросы там, где вы вычитали термины.
Общеупотребимость этих терминов можно оценить http://www.google.ru/search?rlz=1C1GGLS_ruRU327RU327&sourceid=chrome&ie=UTF-8&q=%22%D0%A0%D0%90%D0%A1%D0%A9%D0%95%D0%9F%D0%9B%D0%95%D0%9D%D0%98%D0%95+%D0%A2%D0%90%D0%91%D0%9B%D0%98%D0%A6%22
А что со вторым вопросом?
Как расщепить приведенный пример?
Или как понять что его нельзя расщеплять?

Автор: tatan 6.11.2009, 10:35
Расщепляю:

Node 1

ents
id
1

vals
id
1

entvals
ent_id  val_id
1       1
1       2

Node 2

ents
id
2
vals
id
2
entvals
ent_id  val_id
2       1
2       2


Автор: Zloxa 6.11.2009, 10:38
Цитата(tatan @  6.11.2009,  10:35 Найти цитируемый пост)
Расщепляю:

ну а теперь представте объединение результатов запроса
Код

select * from entvals,ent,vals where end_id = ent.id and val_id = val_id

и сравните с тем, какой он должен быть на самом деле.
И тему можно закрывать.

Автор: tatan 6.11.2009, 10:38
Попробуй поискать так по строке distributed DBMS split table

http://www.google.ru/search?hl=ru&rlz=1C1GGLS_ruRU327RU327&newwindow=1&q=distributed+DBMS+split+table&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=

Автор: Zloxa 6.11.2009, 10:48
Цитата(tatan @  6.11.2009,  10:38 Найти цитируемый пост)
поискать 

тоже http://www.google.ru/search?hl=ru&rlz=1C1GGLS_ruRU327RU327&newwindow=1&q=%22horizontal+table+split%22&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=

Автор: tatan 6.11.2009, 10:53
Согласен. 
Это говорит о том, что может это неинтересно никому.
А мне интересно.
А сл. часть моего вопроса - стратегия получения правильного результата?

Автор: Zloxa 6.11.2009, 11:02
Я не являюсь специалистом по распределенным БД.
Я не знаю как обстоят дела с кластерезацией в отличных от оракла  системах, я не являюсь экспертом в архитектуре оракла.
Но я слышал что ораклиный кластер подразумевает работу несколких нод лишь с одной корзиной
user posted image
http://download-uk.oracle.com/docs/cd/B28359_01/rac.111/b28254/admcon.htm#RACAD7479
Раскидать жа нагрузку по дискам у оракли есть другие средства.

Цитата(tatan @  6.11.2009,  10:53 Найти цитируемый пост)
А сл. часть моего вопроса - стратегия получения правильного результата?

Я бы забил на этот путь как на неперспективный.

Автор: tatan 6.11.2009, 11:50
Не согласен, что путь неперспективный.
Призываю в пост экспертовsmile

Автор: Zloxa 6.11.2009, 11:53
Цитата(tatan @  6.11.2009,  11:50 Найти цитируемый пост)
Не согласен

Обоснуй smile

Цитата(tatan @  6.11.2009,  11:50 Найти цитируемый пост)
Призываю в пост экспертов

да, да! Просим, просим! smile

Добавлено @ 12:01
Предлагаю расщепить еще один набор
Код

vals
val
1
2

sums
sum  desc
1    один
2    два
3    три
4    четыре



и помедетировать над запросом
Код

select v1.val,v2.val,sums.desc from val v1,val v2, sums where sum=v1.val+v2.val

Автор: tatan 6.11.2009, 12:27
Вот здесь есть полезное http://en.wikipedia.org/wiki/Shard_%28database_architecture%29
Во общем, надо искать и найдетсяsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)