«Динамические» таблицы в SQL?C#

Место общения программистов C#
Ответить
Anonymous
 «Динамические» таблицы в SQL?

Сообщение Anonymous »

В настоящее время я работаю над идеей для сайта, где я очень хочу, чтобы мои пользователи создавали «таблицы», содержащие данные, а затем позволяли им запрашивать эти данные (менее вызывающим образом). чем писать SQL-запросы и, надеюсь, проще, чем использовать Excel).

Моя идея на данный момент состоит в том, чтобы представить это в моей базе данных с помощью пары таблиц - иметь одну таблицу представляющий таблицу, одну таблицу, представляющую столбцы таблицы, одну таблицу, представляющую каждую строку таблицы, и, наконец, одну таблицу, представляющую значения. Что-то вроде (ПСЕВДО 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). И последнее, но не менее важное: я надеюсь, что здесь будут хорошие дискуссии — я, по крайней мере, считаю эту тему довольно интересной.

Подробнее здесь: https://stackoverflow.com/questions/921 ... les-in-sql
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»