MongoDB вставлять против ссылки на домашний адрес пользователя? - PullRequest
4 голосов
/ 21 сентября 2019

Я прочитал некоторые форумы и сообщения в блогах, но не нашел хорошего ответа о MongoDB структуре схемы при ссылке на другую коллекцию.

Например, если у меня есть пользовательская коллекция, гдепользователю принадлежит только один адрес (его место жительства).Но данный адрес может быть одинаковым для нескольких пользователей, где структура сбора адресов имеет поля: почтовый индекс, улица, город, штат, страна .Мой вопрос возникает в отношении структуры сбора, где у меня могут быть миллионы пользователей, которые могут, а может и не жить на одной улице, в этом случае было бы лучше использовать адрес внедренный (метод денормализации) напользовательскую коллекцию или используя objectID , чтобы сделать ссылку на коллекцию адресов.

1 Ответ

0 голосов
/ 22 сентября 2019

это действительно зависит от того, как ваше приложение будет запрашивать данные.Однако мое личное эмпирическое правило - не вставлять, если там будет более нескольких сотен объектов / документов.Также вы должны иметь в виду ограничение размера документа 16 МБ на mongodb.если существует вероятность создания миллионов объектов определенного типа, было бы лучше сохранить их в своей собственной коллекции и иметь ссылки на них от связанных объектов.

вот пример ac # того, как я 'сделал бы это для сценария, который вы дали:

using MongoDB.Entities;
using System.Linq;

namespace StackOverflow
{
    public class Program
    {
        public class User : Entity
        {
            public One<Address> Address { get; set; }

            public string Name { get; set; }
        }

        public class Address : Entity
        {
            public Many<User> Users { get; set; }

            public string Street { get; set; }
            public string City { get; set; }
            public string State { get; set; }
            public string ZipCode { get; set; }
            public string Country { get; set; }

            public Address() => this.InitOneToMany(() => Users);
        }

        private static void Main(string[] args)
        {
            // init connection
            new DB("test", "127.0.0.1");

            // create address
            var address = new Address
            {
                Street = "4616 Greenwood Pl",
                City = "Los Angeles",
                State = "CA",
                ZipCode = "90027",
                Country = "USA"
            }; address.Save();

            // create first user
            var user1 = new User
            {
                Name = "Amanda Woodward",
                Address = address.ToReference(),
            }; user1.Save();

            // create second user
            var user2 = new User
            {
                Name = "Billy Campbell",
                Address = address.ToReference(),
            }; user2.Save();

            // link the users to the address
            address.Users.Add(user1);
            address.Users.Add(user2);

            // find all users who live at a given address
            var result1 = DB.Queryable<User>()
                            .Where(u => u.Address.ID == address.ID)
                            .ToList();

            // find address of a given user
            var result2 = DB.Queryable<User>()
                            .Where(u => u.Name == "Amanda Woodward")
                            .Select(u => u.Address)
                            .First()
                            .ToEntity();

            // find a particular user at an address
            var result3 = address.Users.ChildrenQueryable()
                                       .Where(u => u.Name == "Billy Campbell")
                                       .First();

            // find all users living on a given street
            var addressIDs = DB.Queryable<Address>()
                               .Where(a => a.Street.Contains("Greenwood Pl"))
                               .Select(a => a.ID)
                               .ToArray();

            var result4 = DB.Queryable<User>()
                            .Where(u => addressIDs.Contains(u.Address.ID))
                            .ToList();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...