Ну, я уже сталкивался с чем-то подобным - я не хочу делиться фактической схемой таблицы, поэтому давайте сделаем несколько мысленных упражнений, используя некоторые из предложенных структур таблиц:
- Давайте иметь
lists
таблица, содержащая список всех моих списков - Позволяет также иметь таблицу
columns
, содержащую метаданные (имена столбцов) - Теперь нам нужна таблица
values
, которая содержит столбецзначения - Нам также нужна таблица
rows
, которая содержит список всех строк, в противном случае очень трудно определить, сколько на самом деле строк
.просто давайте просто сделаем все строкой (VARCAHR
) и попробуем выполнить несколько запросов:
Подсчет всех строк в таблице
SELECT COUNT(*) FROM [rows]
JOIN [lists]
ON [rows].list_id = [Lists].id
WHERE [Lists].name = 'Cars'
Хм, не так уж плохо, по сравнению с:
SELECT * FROM [Cars]
Вставка строки в таблицу
BEGIN TRANSACTION
DECLARE @row_id INT
DECLARE @list_id INT
SELECT @list_id = id FROM [lists] WHERE name = 'Cars'
INSERT INTO [rows] (list_id) VALUES (@list_id)
SELECT @row_id = @@IDENTITY
DECLARE @column_id INT
-- === Need one of these for each column ===
SELECT @column_id = id FROM [columns]
WHERE name = 'Make'
AND list_id = @list_id
INSERT INTO [values] (column_id, row_id, value)
VALUES (@column_id, @row_id, 'Rover')
-- === Need one of these for each column ===
SELECT @column_id = id FROM [columns]
WHERE name = 'Model'
AND list_id = @list_id
INSERT INTO [values] (column_id, row_id, value)
VALUES (@column_id, @row_id, 'Metro')
COMMIT TRANSACTION
Хм, начало становиться немного волосатым по сравнениюдо:
INSERT INTO [Cars] ([Make], [Model}) VALUES ('Rover', 'Metro')
Простые запросы
I 'Теперь мне надоело создавать утомительно сложные операторы SQL, так что, возможно, вы можете попробовать найти эквивалентные запросы для следующих операторов:
SELECT [Model] FROM [Cars] WHRE [Make] = 'Rover'
SELECT [Cars].[Make], [Cars].[Model], [Owners].[Name] FROM [Cars]
JOIN [Owners] ON [Owners].id = [Cars].owner_id
WHERE [Owners].Age > 50
SELECT [Cars].[Make], [Cars].[Model], [Owners].[Name] FROM [Cars]
JOIN [Owners] ON [Owners].id = [Cars].owner_id
JOIN [Addresses] ON [Addresses].id = [Owners].address_id
WHERE [Addresses].City = 'London'
Я надеюсь, что вы начинаете понимать ...
Короче говоря - я испытал это раньше, и я могу заверить вас, что создание базы данных внутри базы данных таким образом, безусловно, плохо.
Если вам нужно что-то сделать но самые основные запросы в этих списках (и буквально я имею в виду «Могу ли я иметь все элементы в этом списке, пожалуйста?»), Вы должны попытаться найти альтернативу.
Пока каждый пользовательв значительной степени имеет свою собственную базу данных, я определенно рекомендую подход CREATE TABLE
.Даже если они этого не сделают, я все равно рекомендую вам хотя бы рассмотреть это.