В настоящее время я работаю над некоторыми идеями для сайта - где я хочу, чтобы мои пользователи могли создавать «Таблицы», в которых хранятся данные, а затем разрешать им запрашивать эти данные (менее вызывающим образом). чем писать SQL-запросы и, надеюсь, проще, чем использовать Excel).
Моя идея до сих пор состоит в том, чтобы представить это в моей базе данных, используя пару таблиц - иметь одну таблицу, представляющую таблицу, одну таблицу, представляющую столбцы для таблицы, одну таблицу, которая представляет каждую строку в таблице, и, наконец, одну это представляет ценности. Нечто похожее (PSEUDO 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)
)
(обратите внимание, что в таблице TableValues есть 2 поля первичного ключа, она должна представлять собой «составной» первичный ключ, не слишком беспокоитесь о том, что мой синтаксис не является допустимым SQL, просто нужно показать идея).
Я провел небольшое тестирование с этим и смог успешно выполнить простые запросы (простая фильтрация, упорядочение и т. Д.). Мой способ сделать это состоял в том, чтобы сначала запросить таблицу TableRows - для фильтрации я затем отфильтровал строки, столбцы которых не соответствовали критериям, и для сортировки я отсортировал RowIds на основе содержимого их столбца (как указано в указанной сортировке). Результатом стал список идентификаторов строк в нужном порядке, с этого момента он просто выбирал то, что нужно.
Все это прекрасно работает, но я немного застрял здесь. Мне бы хотелось как-то представить различные типы данных (что является моей главной проблемой), а также позже выяснить, как выполнять объединения.
Обдумывая все это, я начинаю задумываться, есть ли лучший способ сделать это. Обратите внимание, что производительность здесь, конечно, является фактором, но я не планирую поддерживать виртуальные таблицы с сотнями тысяч строк, может быть, около 1000 строк на виртуальную таблицу - конечно, вся система должна быть способна обрабатывать многие из это.
Я знаю, что всегда мог просто создавать таблицы в моей базе данных с запросами, создаваемыми на лету в C #, и аналогичным образом выполнять запросы, используя только SQL-запросы - однако я никогда не был большим поклонником того, чтобы позволить пользователям "создавать" запросы по отношению к моей базе данных, как это - и мне кажется, что это приведет к тому, что появятся многие ошибки - и в худшем случае в итоге пользователь сможет так или иначе уничтожить базу данных.
Кроме того, моя проблема заключается в том, как я могу решить эту проблему таким образом, чтобы это имело смысл с точки зрения C #. До сих пор я думаю, что опираюсь на использование LINQ, а затем создаю свои собственные методы расширения, которые бы применяли необходимую функциональность - это ExtensionMethods, расширяющий IQueryable.
Так что мне бы очень хотелось, чтобы были некоторые идеи о том, как это можно сделать, идеи о том, как настроить производительность, идеи о том, как работать с отдельными типами данных в таблице (конечно, сохраните тип в столбце таблицы, но как на самом деле сохранить значение, чтобы я мог фильтровать, сортировать и т. д. по нему? - без добавления столбца «TextValue», «MoneyValue» и т. д. в таблицу tablevalues). И последнее, но не менее важное, мы надеемся, что некоторые хорошие обсуждения здесь - я, по крайней мере, считаю, что это несколько интересная тема.