Что я делаю
Я создаю таблицу SQL, которая обеспечит механизм внутреннего хранения для объектов сложного типа. Я пытаюсь определить, как добиться этого с лучшей производительностью. Мне нужно иметь возможность запрашивать каждое отдельное значение простого типа сложного типа (например, строковое значение City в комплексном типе Address).
Изначально я думал, что смогу хранить значения сложного типа в одной записи в виде XML, но теперь меня беспокоит производительность поиска этого проекта. Мне нужно иметь возможность создавать переменные схемы на лету, ничего не меняя применительно к слою доступа к базе данных .
Где я сейчас нахожусь
Сейчас я думаю создать следующие таблицы.
TABLE: Schemas
COLUMN NAME DATA TYPE
SchemaId uniqueidentifier
Xsd xml //contains the schema for the document of the given complex type
DeserializeType varchar(200) //The Full Type name of the C# class to which the document deserializes.
TABLE: Documents
COLUMN NAME DATA TYPE
DocumentId uniqueidentifier
SchemaId uniqueidentifier
TABLE: Values //The DocumentId+ValueXPath function as a PK
COLUMN NAME DATA TYPE
DocumentId uniqueidentifier
ValueXPath varchar(250)
Value text
из этих таблиц при выполнении запросов я выполняю серию самостоятельных соединений в таблице значений. Когда я хочу получить весь объект по DocumentId, у меня будет общий сценарий для создания представления, имитирующего денормализованные данные сложного типа.
Что я хочу знать
Я полагаю, что есть лучшие способы выполнить то, что я пытаюсь сделать, но я немного не знаю об относительных преимуществах производительности различных методов SQL. В частности, я не знаю стоимость производительности:
1 - comparing the value of a text field versus of a varchar field.
2 - different kind of joins versus nested queries
3 - getting a view versus an xml document from the sql db
4 - doing some other things that I don't even know I don't know would be affecting my query but, I am experienced enough to know exist
Буду признателен за любую информацию или ресурсы об этих проблемах с производительностью в SQL, а также за рекомендацию о том, как подойти к этой общей проблеме более эффективно.
Например,
Вот пример того, что я сейчас планирую сделать.
У меня есть адрес класса C #, который выглядит как
public class Address{
string Line1 {get;set;}
string Line2 {get;set;}
string City {get;set;}
string State {get;set;}
string Zip {get;set;
}
Экземпляр построен из new Address{Line1="17 Mulberry Street", Line2="Apt C", City="New York", State="NY", Zip="10001"}
его значение XML будет выглядеть следующим образом.
<Address>
<Line1>17 Mulberry Street</Line1>
<Line2>Apt C</Line2>
<City>New York</City>
<State>NY</State>
<Zip>10001</Zip>
</Address>
Используя вышеприведенную db-схему, я бы имел одну запись в таблице Schemas с XSD-определением схемы xml адреса. Этот экземпляр будет иметь уникальный идентификатор (PK таблицы документов), который присваивается SchemaId записи адреса в таблице схем. Затем в таблице «Значения» будет пять записей, представляющих этот адрес.
Они бы выглядели так:
DocumentId ValueXPath Value
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/Line1 17 Mulberry Street
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/Line2 Apt C
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/City New York
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/State NY
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/Zip 10001
Только что добавили награду ...
Моя цель - получить ресурсы, которые мне нужны, чтобы дать моему приложению уровень доступа к данным, который полностью доступен для поиска и имеет схему данных, сгенерированную из уровня приложения, который не требует прямой конфигурации базы данных (т.е. создание нового SQL таблица) для добавления нового совокупного корня в модель домена.
Я открыт для возможности использования .NET-совместимых технологий, отличных от SQL, но я буду требовать, чтобы любые такие предложения были надлежащим образом обоснованы для рассмотрения.