Формати на данни едно към едно и едно към много в ArangoDB

Нов в графичното моделиране и ArangoDB, опитвам се да заменя релационна база данни. За отношенията "един към един" или "един към много" се боря да намеря правилен начин за структура на моите документи и ръбове.

UML представяне на база данни

Например, за замяна на таблици auth_credentials, auth_fb, auth_google, които съдържат информация, позволяваща на потребителите да влизат с различни услуги (потребителско име-парола, facebook, google). Мога да си представя 3 начина за структуриране на данните:

  • Създайте колекции auth_* с информацията за удостоверяване и edgeCollections auths_users, за да ги свържете с потребителите. Това съвпада добре със схемата по-горе, но намирам за тромаво да създавам 1 документ и 1 край за всеки обект за удостоверяване.
  • В моите users документи има атрибут auths, който съдържа масиви от обекти с информация за удостоверяване. Очаквам, че ще бъде трудно да се задават запитвания към потребителите въз основа на някаква информация за удостоверяване и това вероятно липсва смисълът на графиките.
  • Създайте edgeCollections auth_*, като _from и _to се свързват с манипулатора на потребителя, който притежава информацията за удостоверяване.

Последната опция ми харесва повече, но се страхувам, че е антимодел да имаме edgeCollections, където винаги имаме _from == _to. По същия начин за groups бих ги направил ръбове от и към техния администратор.

За да обобщим: за представяне на данни B, които принадлежат на данни A, добър подход ли е да се създаде край (от A до A), съдържащ данните на B?


person Elzéar    schedule 14.05.2018    source източник


Отговори (1)


Не звучи като случай на използване на графика. Има само три вида удостоверяване (идентификация, facebook, google) и информацията за удостоверяване не се споделя с множество потребители. По този начин бих вградил данните за удостоверяване в потребителския документ:

{
    "_id": "user/1234",
    "auth": {
        "credentials": { ... },
        "facebook": { ... },
        "google": { ... }
    }
}

Вложените атрибути не са задължителни, напр. ако няма никакви данни за Google auth, просто оставете атрибута "google" далеч.

Пътищата на атрибутите са много лесни за достъп, напр. auth.credentials. Можете също да създадете индекси на податрибутите, ако е необходимо. При масивите има някои ограничения в това отношение и е малко по-сложно да се получи определена информация за удостоверяване от масив (освен ако не дефинирате фиксиран ред, т.е. идентификационни данни при индекс на масив 0 и т.н., но вашата структура от данни не би не бъди вече самоописателен).

Това е и най-ефективното решение, тъй като е единичен документ, прочетен за извличане на информация за потребител + удостоверяване.

person CodeManX    schedule 15.05.2018