2014-12-16 2 views
1

Настройка для этого вопроса немного сложна, пожалуйста, не стесняйтесь :)Как объединить строки БД в документ?

Мой сценарий - перенос данных из формы реляционной таблицы в форму сбора документов («ETL»). Мои исходные данные представлены в реляционной таблице, где каждая строка описывает «Лицо» и один из его «Адресов». (Естественно, эта таблица не нормирована).

Упрощенный пример будет:

PersonId PersonName AddressId AddressText 
1  John Doe 1   Somewhere 
1  John Doe 2   Elsewhere 
2  Jane Doe 3   Some other place 

Чтобы усложнить ситуацию, некоторые строки могут обновить предыдущие существующие значения. Пример:

PersonId PersonName AddressId AddressText 
1  John Doe 1   A new address 

Я хотел бы перенести эти данные в коллекцию документов в документе хранилище (БД) для быстрого поиска конкретного лица субъектов со всеми связанными с ними адресами. Для начала я рассматриваю один документ на одного человека, например, так:

{ 
    "id":"1", 
    "addresses":[ 
     { 
     "id":"1", 
     "text":"A new address" 
     }, 
     { 
     "id":"2", 
     "text":"Elsewhere" 
     } 
    ] 
} 

Мой вопрос: Что такое лучший способ объединить строки таблицы в документ?

Лучше всего использовать хранилище документов, которое поддерживает частичные обновления (MongoDB, RavenDB) и использовать эту функцию?

Или, может быть, я должен извлечь документ целиком из документа DB, обновить его на своем уровне бизнес-логики и сохранить его обратно в БД?

Или я должен стремиться к другому представлению данных документа в целом?

+1

«Слияние строк в документ» означает, что вы хотите перенести данные из реляционной базы данных в документ db, или вам просто интересно, как это сделать? –

+0

@Jaynard хороший вопрос.Сценарий - это действительно миграция данных - ежедневный запланированный процесс ETL. Я также уточню свой вопрос с этой детализацией. – urig

+0

Вы разрешили это? – datasci

ответ

1

Ваш документ может выглядеть следующим образом в MongoDB:

Тогда мы могли бы обновить второй адрес так:

db.collection.update({person_id:PersonId,"addresses.id":AddressId2},{$set:{"addresses.$.street":NewAddress}}) 

Смотрите здесь для дополнительных деталей: http://docs.mongodb.org/manual/reference/operator/update/positional/#update-embedded-documents-using-multiple-field-matches

Надеюсь это поможет.

1

Возможно, вы захотите спросить себя, ПОЧЕМУ вы хотите сделать «частичное обновление» документа. Если требование состоит в том, что вы должны иметь возможность изменять/обновлять адрес человека, вы можете захотеть смоделировать это поведение в объекте Person (вроде того, что вы говорите, «обновляя его на моем уровне бизнес-логики»).

Изменение адресной информации представляется как ответственность за домен и должно (imo) быть смоделировано соответствующим образом. Быстрый пример использования RavenDb в C#:

using (var session = _documentStore.OpenSession()) 
{ 
    var person = session.Load<Person>("persons/1"); 
    person.UpdateAddressInformation(someAddressInformation); 

    session.SaveChanges(); 
} 

Но если вам действительно нужно делать частичные обновления документов, вы можете сделать это с RavenDb, а также:

http://ravendb.net/docs/article-page/2.5/csharp/client-api/partial-document-updates

// J

Смежные вопросы