У меня есть проект, который требует определенных пользователем атрибутов для определенного объекта во время выполнения (скажем, объект-человек в этом примере). В проекте будет много разных пользователей (1000 +), каждый из которых определяет свои собственные уникальные атрибуты для собственных наборов объектов Person.
(Например, пользователь # 1 будет иметь набор определенных атрибутов, которые будут применяться ко всем принадлежащим ему объектам пользователя. Мать это будет на 1000 пользователей, а в нижней строке минимальное количество пользователей приложение будет работать с.) Эти атрибуты будут использоваться для запроса объекта people и возврата результатов.
Я думаю, что это возможные подходы, которые я могу использовать. Я буду использовать С# (и любую версию .NET 3.5 или 4), и у вас есть свободное владение re: что использовать для хранилища данных. (У меня есть mysql и mssql доступны, хотя они имеют свободу использовать любое программное обеспечение, если оно будет соответствовать счету)
Я что-то пропустил или сделал какие-либо неправильные предположения в своей оценке?
Из этих вариантов - какое решение вы бы выбрали?
-
Гибридная модель объекта EAV. (Определите базу данных с использованием обычной реляционной модели и создайте таблицу свойств для таблицы Person).
Недостатки: много соединений для каждого запроса. Низкая производительность. Может достигать предела количества объединений/таблиц, используемых в запросе.
Я выбил быстрый образец, который имеет интерфейс Subsonic 2.x 'esqe:
Select().From().Where ... etc
Что генерирует правильные соединения, затем фильтрует + сворачивает возвращаемые данные в С#, чтобы вернуть данные, настроенные с правильно введенным набором данных.
Мне еще нужно загрузить это решение. Он основан на совете EA в этом техническом документе Microsoft: Документы RTM для SQL Server 2008 Рекомендации по созданию семантических данных для производительности и масштабируемости
-
Разрешить пользователю динамически создавать/изменять таблицу объектов во время выполнения. Это решение является тем, что я считаю NHibernate в фоновом режиме при использовании динамических свойств, как обсуждалось там, где
http://bartreyserhove.blogspot.com/2008/02/dynamic-domain-mode-using-nhibernate.html
Downsides:
По мере роста системы количество определенных столбцов будет очень большим и может поражать максимальное количество столбцов. Если есть 1000 пользователей, каждый из которых имеет 10 различных атрибутов для своих объектов Person, тогда нам понадобится таблица, содержащая 10k столбцов. Не масштабируется в этом сценарии.
Я предполагаю, что могу разрешить таблицу атрибутов person для каждого пользователя, но если есть 1000 пользователей для запуска, то 1000 таблиц плюс другие 10 нечетных в приложении.
Я не уверен, что это будет масштабируемо, но это не похоже. Кто-то, пожалуйста, поправьте меня, если я ошибаюсь!
-
Используйте хранилище данных NoSQL, например CouchDb/MongoDb
Из того, что я прочитал, они еще не доказаны в приложениях большого масштаба, основанных на строках, и находятся на очень раннем этапе разработки. ЕСЛИ я ошибаюсь в этой оценке, может ли кто-нибудь сообщить мне об этом?
-
Использование столбца XML в таблице people для хранения атрибутов
Недостатки - без индексирования при запросе, поэтому каждый столбец необходимо будет получить и запросить для возврата набора результатов, что приведет к снижению производительности запросов.
-
Сериализация графа объектов в базе данных.
Недостатки - без индексирования при запросе, поэтому каждый столбец необходимо будет получить и запросить для возврата набора результатов, что приведет к снижению производительности запросов.
-
Связывание С# для berkelyDB
Из того, что я читаю здесь: http://www.dinosaurtech.com/2009/berkeley-db-c-bindings/
Berkeley Db определенно оказался полезным, но, как заметил Роберт, нет простого интерфейса. Вся ваша обертка WOO должна быть закодирована вручную, а все ваши индексы поддерживаются вручную. Это намного сложнее, чем SQL/linq-to-sql, но это цена, которую вы платите за нелепую скорость.
Похоже на большие накладные расходы - однако, если кто-либо может предоставить ссылку на учебник о том, как поддерживать индексы на С#, это может быть зрителем.
-
[EDIT - просто добавил этот] гибрид SQL/RDF. Странно, я не думал об этом раньше. Как и в случае с вариантом 1, но вместо таблицы "property bag", только XREF в хранилище RDF? Запрос будет включать в себя два шага - запрос в хранилище RDF для людей, которые нажимают правильные атрибуты, возвращать объект человека и использовать идентификатор для этого объекта-человека в запросе SQL для возврата реляционных данных. Дополнительные накладные расходы, но могут быть искателями.
Я бы очень признателен за любой вклад здесь!