Что я делаю
Я создаю таблицу SQL, которая обеспечит внутренний механизм хранения для объектов сложного типа. Я пытаюсь определить, как добиться этого с наилучшей производительностью. Мне нужно иметь возможность запрашивать каждое отдельное значение простого типа сложного типа (например, строковое значение города в сложном типе адреса).
Первоначально я думал, что могу хранить значения сложного типа в одной записи в виде 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, а также за рекомендацию о том, как более эффективно подойти к этой общей проблеме.
Например,
Вот пример того, что я сейчас планирую делать.
У меня есть адрес класса С#, который выглядит как
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, у меня будет одна запись в таблице схем с определением XSD схемы адреса xml. Этот экземпляр будет иметь уникальный идентификатор (PK таблицы Documents), который назначается SchemaId записи Address в таблице Schemas. Тогда в таблице значений будет пять записей, представляющих этот адрес.
Они будут выглядеть так:
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, но я потребую, чтобы любые такие предложения были адекватно обоснованы, чтобы их можно было рассмотреть.