Sql 数据库设计
我现在正在制作一个网络应用程序,我正试图让我的头脑围绕着数据库设计 我有一个用户模型(用户名(主键)、密码、电子邮件、网站) 我有一个条目模型(id、标题、内容、评论、commentCount) 用户只能对条目进行一次注释。做这件事的最佳和最有效的方法是什么 目前,我正在考虑另一个表,它有用户名(来自用户模型)和条目id(来自条目模型) 因此,为了列出条目4的注释,它会搜索id=4 旁注:Sql 数据库设计,sql,database,data-modeling,Sql,Database,Data Modeling,我现在正在制作一个网络应用程序,我正试图让我的头脑围绕着数据库设计 我有一个用户模型(用户名(主键)、密码、电子邮件、网站) 我有一个条目模型(id、标题、内容、评论、commentCount) 用户只能对条目进行一次注释。做这件事的最佳和最有效的方法是什么 目前,我正在考虑另一个表,它有用户名(来自用户模型)和条目id(来自条目模型) 因此,为了列出条目4的注释,它会搜索id=4 旁注: 与其存储注释计数,不如在每次需要时从数据库中计算注释计数?您的确切意思是什么 entry model(id
与其存储注释计数,不如在每次需要时从数据库中计算注释计数?您的确切意思是什么
entry model(id, title, content, **comments**, commentCount)
(我的)?由于每个实体似乎有多个注释,因此它们应存储在单独的表中:
comments(id, entry_id, content, user_id)
entry\u id
和user\u id
是各个表的外键。现在您只需要在(entry\u id
,user\u id
)上创建一个唯一的索引,以确保用户只能为每个实体添加一条注释
此外,您可能希望为users表创建一个代理(数字,通过序列/标识生成)主键,而不是将用户名作为主键。即使这不是问题,您也可能希望有一个作为主键的用户ID,否则如果允许用户更改其用户名,将很困难,或者让某些人知道你不能更改用户名 使联接表在userid和entryid上具有唯一约束。这样,数据库强制只有一个注释/条目/用户 顺便说一句,如果您指定了一个数据库,它会有所帮助
你的设计基本上是合理的。第三个表的名称应该类似于UsersEntriesComments,带有UserName、EntryID和Comment字段。在这个表中,您将有一个由UserName和EntryID字段组成的复合主键;这将强制执行每个用户只能对每个条目评论一次的规则。该表还具有外键约束,例如UserName必须在Users表中,EntryID必须在Entries表中(特别是ID字段) 您可以向Users表中添加一个ID字段,但是许多程序员(包括我自己)提倡尽可能使用“自然”键。由于用户名在您的系统中必须是唯一的,因此这是一个完全有效(且易于阅读)的主键 更新:请重新阅读您的问题。条目表中不需要注释或CommentsCount字段。注释将正确地存储在UsersEntriesComments表中,计数将在查询中动态计算(省去您自己更新此值的麻烦)
更新2:James Black提出了一个很好的观点,即不使用用户名作为主键,而是向表中添加一个人工主键(UserID或类似的)。如果您使用用户名作为主键,则允许用户更改其用户名会更加困难,因为您还必须更改所有相关表中的用户名。听起来您希望确保注释集对于
用户名
Xpost\u id
是唯一的。您可以通过使用唯一约束来实现这一点,或者如果您的数据库系统不明确支持该约束,则可以使用具有相同功能的索引来实现。下面是一些SQL语句:
CREATE TABLE users (
username VARCHAR(10) PRIMARY KEY,
-- any other data ...
);
CREATE TABLE posts (
post_id INTEGER PRIMARY KEY,
-- any other data ...
);
CREATE TABLE comments (
username VARCHAR(10) REFERENCES users(username),
post_id INTEGER REFERENCES posts(post_id),
-- any other data ...
UNIQUE (username, post_id) -- Here's the important bit!
);
以下是我对您的数据模型的建议: 用户表格
- 用户ID(主键,整数)
- 用户名
- 密码
- 电子邮件
- 网站
- 条目ID(主键,整数)
- 参赛作品名称
- 内容
- 条目ID(主键、fk)
- 用户ID(主键,fk)
- 评论
ENTRY\u ID
和USER\u ID
的复合键,这意味着该对在表中只能存在一次(即:1,1不允许再次添加1,1)
不要将计数存储在表中-使用该表的视图,以便根据执行时的现有数据生成计数。顺便说一句,这是PostgreSQL的方言。
CREATE TABLE users (
username VARCHAR(10) PRIMARY KEY,
-- any other data ...
);
CREATE TABLE posts (
post_id INTEGER PRIMARY KEY,
-- any other data ...
);
CREATE TABLE comments (
username VARCHAR(10) REFERENCES users(username),
post_id INTEGER REFERENCES posts(post_id),
-- any other data ...
UNIQUE (username, post_id) -- Here's the important bit!
);