Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库设计_Sql_Database_Data Modeling - Fatal编程技术网

Sql 数据库设计

Sql 数据库设计,sql,database,data-modeling,Sql,Database,Data Modeling,我现在正在制作一个网络应用程序,我正试图让我的头脑围绕着数据库设计 我有一个用户模型(用户名(主键)、密码、电子邮件、网站) 我有一个条目模型(id、标题、内容、评论、commentCount) 用户只能对条目进行一次注释。做这件事的最佳和最有效的方法是什么 目前,我正在考虑另一个表,它有用户名(来自用户模型)和条目id(来自条目模型) 因此,为了列出条目4的注释,它会搜索id=4 旁注: 与其存储注释计数,不如在每次需要时从数据库中计算注释计数?您的确切意思是什么 entry model(id

我现在正在制作一个网络应用程序,我正试图让我的头脑围绕着数据库设计

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

用户只能对条目进行一次注释。做这件事的最佳和最有效的方法是什么

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

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

旁注:
与其存储注释计数,不如在每次需要时从数据库中计算注释计数?

您的确切意思是什么

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上具有唯一约束。这样,数据库强制只有一个注释/条目/用户

顺便说一句,如果您指定了一个数据库,它会有所帮助

  • 我不会将用户名用作主ID。我会使用自动增量生成数字ID
  • 我会在relations表中使用这个新id,并在这两个字段上使用一个唯一的键

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

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

    更新:请重新阅读您的问题。条目表中不需要注释或CommentsCount字段。注释将正确地存储在UsersEntriesComments表中,计数将在查询中动态计算(省去您自己更新此值的麻烦)


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

    听起来您希望确保注释集对于
    用户名
    X
    post\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)
    • 评论
    此设置允许条目有0+个注释。添加注释时,主键是
    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!
    );