У меня есть проект, который требует определенных пользователем атрибутов для определенного объекта во время выполнения (скажем, объект-человек в этом примере). В проекте будет много разных пользователей (1000 +), каждый из которых определяет свои собственные уникальные атрибуты для собственных наборов объектов Person.Еще один вопрос о динамической модели данных
(Например, пользователь # 1 будет иметь набор определенных атрибутов, который будет применяться ко всем принадлежащим ему объектам пользователя. Мать это будет 1000 пользователей, и это минимальное количество пользователей, которое приложение будет работать с.) Эти атрибуты будут использоваться для запроса объекта people и возврата результатов.
Я думаю, что это возможные подходы, которые я могу использовать. Я буду использовать C# (и любую версию .NET 3.5 или 4), и у вас есть свободное владение re: что использовать для хранилища данных. (У меня есть mysql и mssql, хотя у вас есть свобода использовать любое программное обеспечение, если оно будет соответствовать счету)
Пропустил ли я что-нибудь или сделал какие-либо неправильные предположения в своей оценке?
Из этих вариантов - какое решение вы бы выбрали?
Гибридная модель объекта EAV. (Определите базу данных с использованием обычной реляционной модели и найдите таблицу «Property Bag» для таблицы Person).
Недостатки: много соединений по запросу. Низкая производительность. Может достигать предела количества объединений/таблиц, используемых в запросе.
Я постучал быстрый образец, который имеет дозвуковой 2.x «esqe интерфейс:
Select().From().Where ... etc
, который генерирует правильное соединение, то фильтры + вращают возвращаемые данные в C#, чтобы возвращать datatable, настроенный с правильно введенным набором данных.
Мне еще нужно загрузить это тестовое решение. Он основан на совете EA в этом техническом документе Microsoft: SQL Server 2008 RTM Documents Best Practices for Semantic Data Modeling for Performance and Scalability
Позволяет пользователю динамически создавать/изменять таблицу объекта во время выполнения. Это решение я считаю, NHibernate делает в фоновом режиме при использовании динамических свойств, как описано, где
http://bartreyserhove.blogspot.com/2008/02/dynamic-domain-mode-using-nhibernate.html
Downsides:
По мере роста системы, количество столбцов, определенных будет очень большим, и может поражать максимальное количество столбцов. Если есть 1000 пользователей, каждый из которых имеет 10 различных атрибутов для своих объектов Person, тогда нам понадобится таблица, содержащая 10k столбцов. Не масштабируется в этом сценарии.
Я думаю, что я мог бы разрешить таблицу атрибутов человека для каждого пользователя, но если есть 1000 пользователей для запуска, это 1000 таблиц плюс остальные 10 нечетных в приложении.
Я не уверен, что это будет масштабируемо, но это не похоже. Кто-то, пожалуйста, поправьте меня, если я ошибаюсь!
Используйте хранилищу NoSQL, такие как CouchDB/MongoDb
Из того, что я читал, это еще не доказано в крупномасштабных приложений, основанный на строках, и очень рано в стадии разработки.ЕСЛИ я ошибаюсь в этой оценке, может ли кто-нибудь сообщить мне об этом?
Использование столбца XML в таблице людей в магазине Атрибуты
Недостатки - отсутствие индексации на запросе, поэтому каждый столбец должен был бы быть извлечена и запрашиваются для возврата результирующего набора, что приводит к плохому запроса представление.
Сериализация графического объекта в базу данных.
Недостатки - без индексирования при запросе, поэтому каждый столбец необходимо будет получить и запросить для возврата набора результатов, что приведет к снижению производительности запросов.
C# привязок для berkelyDB
Из того, что я прочитал здесь: http://www.dinosaurtech.com/2009/berkeley-db-c-bindings/
Berkeley Db определенно доказано, чтобы быть полезным, но, как Роберт отметил, - там нет простого интерфейса. Вся ваша обертка WOO должна быть закодирована вручную, а все ваши индексы поддерживаются вручную. Это намного сложнее, чем SQL/linq-to-sql, но это цена, которую вы платите за нелепую скорость.
Кажется, что большие накладные расходы - однако, если кто-либо может предоставить ссылку на учебник о том, как поддерживать индексы на C#, это может быть искатель.
[EDIT - только что добавил этот] гибрид SQL/RDF. Странно, я не думал об этом раньше. Как и в случае с вариантом 1, но вместо таблицы «property bag», только XREF в хранилище RDF? . Запрос будет включать в себя два шага - запрос в хранилище RDF для людей, попадающих в правильные атрибуты, для возврата объекта (-ов) человека и использования идентификаторов для этого объекта-человека в запросе SQL для возврата реляционных данных. Дополнительные накладные расходы, но могут быть искателями.
Я очень благодарен за любые вводные данные здесь!
+1 за хорошие исследования, прежде чем задать вопрос. Посмотрите на MongoDB. Попробуйте прослушать [this] (http://www.dotnetrocks.com/default.aspx?showNum=507) подкаст и, похоже, это то, что вы ищете. Извините, я не использовал его лично. – shahkalpesh
Для информации по 4; вы можете комбинировать столбцы xml с вычисленными столбцами + persisted + indexed, но вы вернетесь в сценарий «слишком много столбцов». Вам нужно уметь ** искать ** по динамическим свойствам? Это может быть кодовым фактором, который различает мешок свойств через пары ключ/значение в таблице и сериализацию/xml. –
Да - основной задачей приложения является поиск по динамическим свойствам эффективным способом. Я не думал о объединении столбцов xml с вычисленными столбцами + persisted + indexed - есть ли у вас какие-либо ресурсы, объясняющие это дальше? – James