Я думаю, что есть несколько подходов, и этот вопрос старый, но я дам свои два цента, поскольку я работал над этим ранее в этом году.Я использовал MongoDB.
В моем случае у меня была учетная запись пользователя, которая затем имела профили в разных социальных сетях.Мы хотели отслеживать изменения в профилях социальных сетей и хотели пересмотреть их, поэтому мы создали две структуры для тестирования.Оба метода имеют объект User, который указывает на посторонние объекты.Мы не хотели вставлять объекты с самого начала.
Пользователь выглядел примерно так:
User {
"tags" : [Tags]
"notes" : "Notes"
"facebook_profile" : <combo_foreign_key>
"linkedin_profile" : <same as above>
}
, а затем для combo_foreign_key мы использовали этот шаблон (используя синтаксис Ruby для интерполяцииsimplicity)
combo_foreign_key = "#{User.key}__#{new_profile.last_updated_at}"
facebook_profiles {
combo_foreign_key: facebook_profile
... and you keep adding your foreign objects in this pattern
}
Это дало нам O (1) поиск последнего FacebookProfile пользователя, но потребовало, чтобы мы сохранили последний FK, сохраненный в объекте User.Если бы мы хотели получить все профили FacebookProfiles, мы бы запросили все ключи в коллекции facebook_profiles с префиксом «# {User.key} __», и это было O (N) ...
Вторая стратегиямы пытались сохранить массив этих ключей FacebookProfile на объекте User, поэтому структура объекта User изменилась с
"facebook_profile" : <combo_foreign_key>
на
"facebook_profile" : [<combo_foreign_key>]
Здесь мы просто добавим кновый combo_key, когда мы добавили новый вариант профиля.Затем мы бы просто быстро отсортировали атрибут «facebook_profile» и проиндексировали самый большой из них, чтобы получить нашу последнюю копию профиля.Этот метод должен был отсортировать M строк и затем проиндексировать FacebookProfile на основе самого большого элемента в этом отсортированном списке.Немного медленнее захватывает последнюю копию, но это дает нам преимущество, зная каждую версию FacebookProfile Users одним махом, и нам не нужно беспокоиться о том, чтобы foreign_key действительно был последним объектом профиля.
Сначаланаши пересмотры были довольно малы, и они оба работали довольно хорошоЯ думаю, что сейчас предпочитаю первое, а не второе.
Хотелось бы услышать мнение других о том, как они решили эту проблему.Идея GIT, предложенная в другом ответе, на самом деле звучит для меня по-настоящему изящно, и для нашего варианта использования она вполне подойдет ... Круто.