2015-02-19 3 views
2

Я читал о базах данных Graph и хотите знать, если этот тип структуры применим к нему:Является ли эта концепция применимой для базы данных графа?

компании> Has Учетные записи пользователей> Учетные записи разослать facebook сообщения (которые доступны для всех пользователей)

До сих пор - я думаю, это имеет смысл - да, это было бы полезно использовать Graph. Сообщение имеет отношение к любым учетным записям, и вы можете узнать направление в обоих направлениях - сообщения для компании и какие сообщения были отправлены пользователями или компаниями.

Однако

  • Пользователи, добавленные получить и удалены на ежедневной основе, и мне нужен магазин звукозаписей, сколько было в данный момент времени
  • Счета получение результатов для каждой должности (нравится/друзей) которые мне нужно хранить на ежедневной основе
  • мне нужно, чтобы узнать, сколько нравится компания получила (в любой день)
  • Мне также нужно, чтобы узнать, сколько любит пользователь получил
  • мне нужно фи nd out, сколько понравилось пользователю, полученному за сообщение
  • Вам нужно будет хранить Likes как группу, а затем дату-значение - можете ли вы даже иметь свойства «sub»?

Я боюсь в этой точке, если вы не храните много списков свойств даты и значения на узел. Так вы это сделаете? Если бы я хотел найти более поздние 2 балла, например, это было бы так же эффективно, как РСУБД?

ответ

4

Вот очень простой пример модели данных Графа, которая, кажется, охватывает ваши заявленные варианты использования. (Так как узлы могут иметь несколько ярлыков, все Company и User узлов также Entity узлов - для упрощения модели.)

(:Company:Entity {id:100})-[:HAS_USER]->(:User:Entity {id: 200}) 
(:Entity)-[:SENT]->(:Post {date: 123, msg: "I like cats!"}) 
(:Entity)-[:LIKES {date: 234}]->(:Post) 

случаи использования:

  1. Пользователей добавляются и удаляются на ежедневно, и мне нужен рекордный магазин, сколько было в данный момент.

    Как посчитать всех пользователей:

    MATCH (u:User) 
    RETURN COUNT(*); 
    

    Как сосчитать пользователей компании:

    MATCH (c:Company {id:100})-[:HAS_USER]->(u:User) 
    RETURN COUNT(*); 
    
  2. Мне нужно, чтобы узнать, сколько нравится компания получила (в любой день)

    MATCH (c:Company {id: 100})-[:SENT]->(p:Post)<-[:LIKES {date:234}]-() 
    RETURN COUNT(*) 
    
  3. мне также нужно выяснить, сколько любит пользователь получил

    MATCH (u:User {id:200})-[:SENT]->(p:Post)<-[:LIKES]-() 
    RETURN COUNT(*); 
    
  4. Мне нужно, чтобы узнать, сколько любит пользователь получил по почте

    MATCH (u:User {id:200})-[:SENT]->(p:Post)<-[:LIKES]-() 
    RETURN p, COUNT(*) 
    
  5. Вы должны хранить Likes как группу, а затем дату-значение - можете ли вы иметь свойства «sub»?

    Вам не нужно явно группировать понравившиеся по дате (если это то, что вы имеете в виду). Такие «группировки» могут быть легко получены соответствующим запросом (например, в № 2 выше).

+0

Так что если ваше мнение, то база данных Graph будет соответствовать нашим требованиям. Я немного смущен, хотя о том, как вы будете хранить даты на элемент, который я бы традиционно хранил в простой таблице, и ссылаюсь на сообщение. Так, например: 10/2/15 - 1 нравится - сообщение 1, 11/2/15 - 2 нравится - сообщение 1 и т. Д. Если эти данные не сгруппированы где и как вы его сохраните? Это на узле, таком как дата-10/2/15: 1? Спасибо – Antony

+1

@Antony попытаться обернуть вокруг вас [Multi-Model Database | OrientDB Manual] (http://www.orientechnologies.com/docs/last/orientdb.wiki/Tutorial-Document-and-graph-model.html) и [TinkerPop3> Проблемы> мета-свойства и мульти-свойства для безопасности и история № 489] (https://github.com/tinkerpop/tinkerpop3/issues/489). Вот где я попытаюсь найти ответ, пока вы еще не в замке поставщика – xmojmr

+0

Спасибо - мне нравится OrientDB. Я правильно понял, что буду использовать Graph для основных данных, а затем Clusters для хранения истории, связанной с этим элементом? – Antony

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