【问题标题】:SQL Database design help needed需要 SQL 数据库设计帮助
【发布时间】:2010-11-11 14:01:39
【问题描述】:
我正在尝试限制我的数据库中的表的数量,因为我听说这很好(我是一个新手 Web 开发人员)。我想让用户在数据库中输入一个列表。所以他们输入一个标题,整体评论,然后开始制作列表。如果不为每个列表创建一个新表,我无法弄清楚如何做到这一点。因为,假设一个用户想要一个包含 44 个值的列表,而另一个用户想要一个包含 10 个值的列表。如果不为每个列表创建一个新表,我想不出该怎么做。我非常感谢您能给我的任何帮助/见解。
【问题讨论】:
标签:
sql-server
optimization
database-design
【解决方案1】:
基本上,您想为用户列表创建一个表,其中表中的每一行引用一个用户的列表,另一个表用于用户列表值,其中表中的每一行都有一个列用于引用它所属的列表,以及用户输入值的列。
【解决方案2】:
您的餐桌可能是:
用户 ID,整数
ListID, int(主键唯一标识符)
标题, VarChar(250)
注释,VarChar(MAX)
Example Content:
1 | 1 | The Title | My Comment
1 | 2 | The Other Title | My other comment
2 | 3 | First Comment | Second Person, first comment
每个用户只需从查询中获取他们的列表:
从 the_Table 中选择 ListID、Titel、Comment
其中用户 ID = @UserID
【解决方案3】:
您可以为所有列表使用单个行表,例如简单地说
CREATE TABLE ListLines (
listID INTEGER,
lineNo INTEGER,
line TEXT,
PRIMARY KEY (listID, lineNo),
FOREIGN KEY (listID) REFERENCES Lists
);
列表变成:
CREATE TABLE Lists (
listID INTEGER PRIMARY KEY,
userID INTEGER,
title TEXT,
comment TEXT,
FOREIGN KEY (userID) REFERENCES Users
);
假设您有一个带有主键 userID INTEGER 的 Users 表,其中包含每个用户的信息(姓名等)。
所以要得到一个给定 ID 的列表的所有行
SELECT line FROM ListLines
WHERE listID=:whateverid
ORDER BY lineNo;
或者您可以将其与例如 UNION标题:
SELECT title AS line FROM Lists
WHERE listID=:whateverid
UNION ALL
SELECT line FROM ListLines
WHERE listID=:whateverid
ORDER BY lineNo;
等等。这种灵活高效的安排就是关系型的做事方式……