В настоящее время я общаюсь с некоторыми вещами для идеи для сайта - там, где я очень хочу, чтобы мои пользователи создали «Таблицы», которые содержат данные, а затем позволяют им запрашивать эти данные (менее вызывающим образом, чем записывая SQL-запросы и, надеюсь, проще, чем использование excel)."Динамические" таблицы в SQL?
Моя идея состоит в том, чтобы представить это в моей базе данных, используя пару таблиц, - иметь одну таблицу, представляющую таблицу, одну таблицу, представляющую столбцы для таблицы, с одной таблицей, представляющей каждую строку в таблице, и, наконец, который представляет значения. Что-то похожее на (псевдо 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.
Так что мне бы хотелось, чтобы некоторые идеи о том, как это можно сделать, идеи о том, как настроить производительность, идеи о том, как обращаться с отдельными типами данных в таблице (естественно, сохраните тип в таблице column , но как фактически сохранить значение, чтобы я мог фильтровать, сортировать и т. д.? - без добавления столбца «TextValue», «MoneyValue» и так далее в таблицу table table). И последнее, но не менее важное, надеюсь, здесь будут хорошие дискуссии - я, по крайней мере, считаю это интересной темой.
Я голосую за вас в качестве стимула отправить это на http://www.thedailywtf.com – TheTXI
Как говорит TheTXI, мы видим эту «схему» все время на The Daily WTF. Это невероятно плохая идея. И веселый. – Welbog
У меня была идея, что это будет плохая схема, и именно поэтому я разместил здесь - чтобы получить некоторые идеи о том, как улучшить идею. Я забочусь о том, что могу сделать, а не о том, будет ли это сделано так или иначе. А также, я забочусь о обучении :). – kastermester