Моя идея на данный момент состоит в том, чтобы представить это в моей базе данных с помощью пары таблиц - иметь одну таблицу представляющий таблицу, одну таблицу, представляющую столбцы таблицы, одну таблицу, представляющую каждую строку таблицы, и, наконец, одну таблицу, представляющую значения. Что-то вроде (ПСЕВДО SQL):
Код: Выделить всё
CREATE TABLE 'Tables' (
Id INT NOT NULL PRIMARY KEY,
NAME VARCHAR(255)
)
CREATE TABLE 'TableColumns' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
NAME VARCHAR(255)
)
CREATE TABLE 'TableRows' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
RowNumber INT NOT NULL
)
CREATE TABLE 'TableValues' (
RowId INT NOT NULL PRIMARY KEY,
ColumnId INT NOT NULL PRIMARY KEY,
Value VARCHAR(255)
)
Я провел небольшое тестирование и смог успешно выполнить простые запросы (простая фильтрация, заказ и так далее). Мой способ сделать это заключался в том, чтобы сначала запросить таблицу TableRows - для фильтрации я затем отфильтровал строки, столбцы которых не соответствовали критериям, а для сортировки я отсортировал RowIds на основе содержимого их столбца (как указано в указанной сортировке). В результате появился список идентификаторов строк в желаемом порядке, с этого момента нужно было просто выбрать то, что нужно.
Все это работает нормально, но я немного застрял отсюда. Мне бы хотелось каким-то образом представлять разные типы данных (это на самом деле моя основная проблема), а также позже разобраться, как выполнять соединения.
Пока все обдумываю через это я начинаю задаваться вопросом, есть ли лучший способ сделать это. Обратите внимание, что производительность здесь, конечно, является важным фактором, но я не планирую поддерживать виртуальные таблицы с сотнями тысяч строк, возможно, около 1000 строк на виртуальную таблицу - конечно, вся система должна быть способна обрабатывать многие из них.
Я знаю, что всегда могу просто создавать таблицы в своей базе данных с запросами, созданными на лету в C #, чтобы выполнить это, а также выполнять запросы, используя только запросы SQL - однако Я никогда не был большим поклонником того, чтобы пользователи могли «конструировать» запросы к моей базе данных подобным образом — и мне кажется, что это приведет к появлению множества ошибок — и в худшем случае сценарий в конечном итоге позволит пользователю тем или иным образом убить базу данных.
Кроме того, у меня возникает вопрос, как я могу справиться с этим так, чтобы это имело смысл с точки зрения C#. Пока что я полагаюсь на использование LINQ, а затем создаю свои собственные методы расширения, которые будут применять необходимую функциональность - это ExtensionMethods, расширяющий IQueryable.
И что бы я сделал очень хотелось бы иметь некоторые идеи о том, как это можно сделать, идеи о том, как настроить производительность, идеи о том, как обращаться с отдельными типами данных в таблице (конечно, хранить тип в столбце таблицы, но как на самом деле сохранить значение так Я могу фильтровать, сортировать и т. д. с его помощью? - не просто добавляя столбцы «TextValue», «MoneyValue» и т. д. в мою таблицу tablevalues). И последнее, но не менее важное: я надеюсь, что здесь будут хорошие дискуссии — я, по крайней мере, считаю эту тему довольно интересной.
Подробнее здесь: https://stackoverflow.com/questions/921 ... les-in-sql
Мобильная версия