2013-04-09 1 views
1

Дэвид, я мог попросить некоторого разъяснения о том, что вы можете сказать о присоединяется this answerреляционные магазины и многие-к-одному присоединяется

Когда вы говорите, «Вы не можете, используя объединение реляционных магазинов, присоединиться к одной записи к нескольким ", означает ли это в любом направлении?

E.g. Магазин 1:

| Key1 | Measure1 | 

магазин 2:

| Key 1 | SomeId1 | Measure2 | Measure3 | 
| Key 1 | SomeId2 | Measure4 | Measure4 | 

Так это не представляется возможным соединить эти два магазина, поставив джойн из магазина 2 в магазине 1?

И если нет, вы говорите, что единственный способ справиться с этим - дублировать записи в Магазине 1? Например:

Store 1 
| Key 1 | SomeId1 | Measure1 | Measure2 | Measure3 | 
| Key 1 | SomeId2 | Measure1 | Measure4 | Measure4 | 

ответ

1

Направление имеет значение для одного-ко-многим: это зависит от того, какой магазин является «родительским».

Реляционные магазины включают в себя концепцию «ActivePivot Store», которая является вашим основным хранилищем (на котором основана ваша схема). Затем этот магазин можно присоединить к одному или нескольким магазинам с учетом набора ключевых полей, которые мы будем называть «дочерними» магазинами для простоты. Каждый из этих дочерних магазинов может быть соединен с другими магазинами и т. Д. (Вы можете представить его с помощью ориентированного графа).

Главное правило состоит в том, что у вас никогда не должно быть записи «родительского» хранилища, разрешающей несколько записей «дочернего» хранилища (и не должно быть никаких циклических отношений, которые я считаю).

Упрощенная идея реляционных хранилищ (как RS 1.5.x/AP 4.4.x) заключается в том, что когда одна запись отправляется в «ActivePivot Store», то, начиная с хранилища ActivePivot, она рекурсивно разрешает соединяется, чтобы получить максимум одну запись в каждом из объединенных хранилищ. В зависимости от определения вашей схемы эти записи будут использоваться для заполнения факта перед его вставкой в ​​куб.

Если решение об объединении приведет к более чем одной записи, то AP не сможет выбрать, какой из них использовать, чтобы заполнить этот факт и выдать исключение.

Возвращаясь к вашему примеру, вы можете сделать соединение между Магазином 1 и Магазином 2 только в том случае, если Store 2 является вашим хранилищем ActivePivot или «родителем» Магазина 1 (APStore -> ...-> Store2- > Store1), который, кажется, ваш случай.

Если нет (Store1-> Store2), вам необходимо будет дублировать записи Магазина 1, чтобы гарантировать, что при разрешении соединения всегда будет найдено максимум одна запись. Магазин 1 будет тогда выглядит следующим образом:

| Key 1 | SomeId1 | Measure1 
| Key 1 | SomeId2 | Measure1 

Вашего присоединиться магазин-затем будет сделан на полях «Key, SomeId» вместо просто «ключа», и что обеспечит вам найти только одну запись, когда разрешающей store1 -> Store2

+0

Спасибо, Дэвид. Так должен ли быть когда-нибудь единственный магазин с типом «ACTIVEPIVOT_STORE», а все остальное - реляционные хранилища ванили? – obrienk

+1

Если ваша схема основана на реляционных хранилищах, тогда да, должен быть только один ACTIVEPIVOT_STORE, а остальные - ванильные магазины. Если у вас две схемы, у вас может быть два ACTIVEPIVOT_STORE, хотя – David