2

我现在正在制作一个 web 应用程序,我正试图了解数据库设计。

我有一个用户模型(用户名(主键)、密码、电子邮件、网站)我有一个条目模型(id、标题、内容、评论、commentCount)

用户只能对条目发表一次评论。这样做的最佳和最有效的方法是什么?

目前,我正在考虑另一个具有用户名(来自用户模型)和条目 ID(来自条目模型)的表

   **username    id**
    Sonic        4
    Sonic        5
    Knuckles     2
    Sonic        6
    Amy          15
    Sonic        20
    Knuckles     5
    Amy          4

因此,要列出条目 4 的注释,它会搜索 id=4。

附带说明: 每次需要时从数据库中计算评论计数,而不是存储评论计数会更好吗?

4

6 回答 6

2

你的设计基本上是合理的。您的第三个表应该命名为 UsersEntriesComments 之类的名称,其中包含 UserName、EntryID 和 Comment 字段。在此表中,您将拥有一个由 UserName 和 EntryID 字段组成的复合主键;这将强制执行每个用户只能对每个条目发表一次评论的规则。该表还将具有外键约束,例如 UserName 必须在 Users 表中,而 EntryID 必须在 Entries 表中(特别是 ID 字段)。

您可以在 Users 表中添加一个 ID 字段,但许多程序员(包括我自己)主张尽可能使用“自然”键。由于用户名在您的系统中必须是唯一的,因此这是一个完全有效(且易于阅读)的主键。

更新:再次阅读您的问题。您不需要 Entries 表中的 Comments 或 CommentsCount 字段。评论将正确地存储在 UsersEntriesComments 表中,并且计数将在您的查询中动态计算(省去您自己更新此值的麻烦)。

更新 2:James Black 提出了一个很好的观点,即使用 UserName 作为主键,而是向表中添加人工主键(UserID 或类似的)。如果您使用 UserName 作为主键,则允许用户更改其用户名会更加困难,因为您还必须更改所有相关表中的用户名。

于 2009-09-10T22:49:19.983 回答
2

你到底是什么意思

entry model(id, title, content, **comments**, commentCount)

(强调我的)?由于看起来每个实体有多个评论,它们应该存储在一个单独的表中:

comments(id, entry_id, content, user_id)

entry_id并且user_id是各个表的外键。现在您只需要在 ( entry_id, user_id) 上创建一个唯一索引,以确保用户只能为每个实体添加一条评论。

此外,您可能希望为您的用户表创建一个代理(数字,通过序列/身份生成)主键,而不是让用户名成为您的 PK。

于 2009-09-10T22:42:27.770 回答
2
  1. 我不会使用用户名作为主要 ID。我会用自动增量制作一个数字ID
  2. 我将在关系表中使用该新 ID,并在 2 个字段上使用唯一键
于 2009-09-10T22:43:09.357 回答
2

这是我对您的数据模型的建议:

用户

  • USER_ID (pk, int)
  • 用户名
  • 密码
  • 电子邮件
  • 网站

条目

  • ENTRY_ID (pk, int)
  • ENTRY_TITLE
  • 内容

ENTRY_COMMENTS

  • ENTRY_ID (pk, fk)
  • USER_ID (pk, fk)
  • 评论

此设置允许 ENTRY 有 0+ 条评论。添加注释时,主键是 and 的复合键,ENTRY_ID表示USER_ID该对只能在表中存在一次(IE: 1, 1 不允许再次添加 1, 1)。

不要将计数存储在表中 - 为此使用 VIEW,以便可以在执行时根据现有数据生成数字。

于 2009-09-11T00:55:37.680 回答
1

即使它不在问题中,您也可能希望拥有一个作为主键的用户 ID,否则如果允许用户更改他们的用户名,或者让某些人知道您无法更改用户名,这将很困难。

使联接表对 userid 和 entryid 具有唯一约束。这样,数据库强制只有一个评论/条目/用户。

顺便说一句,如果您指定一个数据库,这将有所帮助。

于 2009-09-10T22:42:37.347 回答
0

听起来您想保证评论集对于 usernameX是唯一的post_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!
);
于 2009-09-10T23:14:24.690 回答