Есть ли в SQL Server встроенная поддержка EAV? - PullRequest
0 голосов
/ 31 марта 2011

Мне нравятся возможности гибкой схемы CouchDB и MongoDB, но мне также нравится возможность реляционного объединения SQL Server. Что я действительно хочу, так это возможность иметь такие таблицы, как PERSON, COMPANY и ORDER, которые по сути являются «открытой схемой», где каждая таблица имеет идентификатор, но остальные столбцы определены в стиле json {ID:12,firstname:"Pete",surname:"smith",height:"180"}, но там, где я могу эффективно присоединить PERSON к COMPANY либо напрямую, либо через таблицу внешних ссылок «многие ко многим». Кто-нибудь знает, есть ли у SQL Server какие-либо планы по включению «открытой схемы» в SQL, или же у Mongo или Couch есть планы по поддержке эффективного объединения? Большое спасибо.

Ответы [ 4 ]

2 голосов
/ 31 марта 2011

CouchDB предлагает несколько способов установить отношения между вашими различными документами / сущностями. Прочтите эту статью в вики, чтобы начать.

Тенденция, исходящая из реляционного фона, заключается в том, чтобы продолжать использовать ту же терминологию и мышление всякий раз, когда вы пытаетесь решить проблемы. Очень важно понимать, что решения NoSQL очень разные, иначе у них нет реальной цели для существования. Вы должны действительно стремиться понять, как работают эти различные решения NoSQL, чтобы вы могли сравнить их с требованиями вашего приложения, чтобы убедиться, что оно подходит.

1 голос
/ 31 марта 2011

Столько, сколько это было бы неэффективно для Запроса в больших масштабах, с технической точки зрения, использование типа данных XML позволит вам сохранить любую структуру, которую вы хотите, которая может варьироваться в зависимости от строки.

1 голос
/ 31 марта 2011

MongoDB = NoSQL = Нет соединений - никогда никогда.

Если вам нужны СОЕДИНЕНИЯ из-за вашей модели данных или требований проекта: оставайтесь с СУРБД.

Альтернативы в MongoDB:

  • денормализация

  • с использованием встроенных документов

  • несколько запросов

0 голосов
/ 31 марта 2011

Не то чтобы я это знал, но не так уж и сложно определить собственный EAV, это всего лишь 3 таблицы:)

  • Объект сохраняет имя связанной таблицы.
  • Атрибут хранит имя столбца, тип данных и может ли он иметь значение NULL.
  • Значение содержит по одному столбцу NULL для каждого необходимого типа данных.

Entity 1 .. * Атрибут 1 ..* Значения

Предполагая, что вы используете .NET, определите свои интерфейсы EAV, создайте несколько POCO и позвольте Entity Framework или вашему ORM по вашему выбору соединить ассоциации для вас.LINQ отлично работает для такого рода операций.

Он также позволяет создавать гибридную модель, в которой части схемы известны, но вам все еще нужна гибкость для пользовательских данных.Если вы разрабатываете свою модель предметной области с учетом этого (т.е. используете интерфейсы EAV в своей модели), EAV может быть встроен в контекст данных EF (или любой другой), чтобы автоматизировать загрузку атрибутов и их значений для каждой сущности.Ваша сущность EF просто должна знать, к какой сущности таблицы она принадлежит.

Конечно, это не идеальное решение, так как вы (потенциально) торгуете ради гибкости.В зависимости от объема данных, которые вы хотите сохранить, и требований к производительности, он может больше подходить для моделей, в которых известна большая часть схемы, а меньший процент неизвестен.YMMV.

...