Vâng, tôi đã có kinh nghiệm một cái gì đó như thế này trước đây - Tôi không muốn chia sẻ schema bảng thực tế để cho phép thực hiện một số bài tập suy nghĩ sử dụng một số bảng gợi ý cấu trúc:
- Cho phép có một bảng
lists
chứa một danh sách của tất cả các danh sách của tôi
- cũng cho phép có một bảng
columns
chứa siêu dữ liệu (tên cột)
- Bây giờ chúng ta cần một bảng
values
chứa các cột giá trị
- Chúng ta cũng cần một bảng
rows
mà chứa một danh sách của tất cả các hàng, nếu không nó sẽ rất khó khăn để tìm ra bao nhiêu hàng có thực sự là
Để giữ cho mọi thứ đơn giản cho phép chỉ làm cho mọi thứ một chuỗi (VARCAHR
) và có một đi vào đến với một số truy vấn:
Đếm tất cả các hàng trong một bảng
SELECT COUNT(*) FROM [rows]
JOIN [lists]
ON [rows].list_id = [Lists].id
WHERE [Lists].name = 'Cars'
Hmm, không quá xấu, so với:
SELECT * FROM [Cars]
Chèn một hàng vào một bảng
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
Um, bắt đầu để có được một chút lông so với:
INSERT INTO [Cars] ([Make], [Model}) VALUES ('Rover', 'Metro')
Đơn giản truy vấn
Tôi bây giờ chán xây dựng câu lệnh SQL tediously phức tạp như vậy có lẽ bạn có thể có một đi vào đến với truy vấn tương đương về những điều khoản followng:
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'
Tôi hy vọng bạn đang bắt đầu để có được ý tưởng ...
Tóm lại - Tôi đã trải qua điều này trước và tôi có thể đảm bảo với bạn rằng việc tạo cơ sở dữ liệu bên trong cơ sở dữ liệu theo cách này chắc chắn là một điều xấu.
Nếu bạn cần làm mọi thứ nhưng truy vấn cơ bản nhất trên các danh sách này (nghĩa đen là "Tôi có thể có tất cả các mục trong danh sách này không?"), Bạn nên thử thay thế.
Miễn là mỗi người dùng có khá nhiều cơ sở dữ liệu riêng, tôi chắc chắn sẽ giới thiệu phương pháp tiếp cận CREATE TABLE
. Ngay cả khi họ không muốn tôi vẫn khuyên bạn nên ít nhất là xem xét nó.
Không tệ chút nào, nhưng thường quy ước là không sử dụng số nhiều. Đó là các tên bảng thường là List, ListColumn, ListRow, ListData. Các bảng có nhiều hơn một hàng, sử dụng số nhiều là thừa. – Hogan