簡體   English   中英

數據庫設計

[英]Database Design

我現在正在制作一個webapp,我正試圖了解數據庫設計。

我有一個用戶模型(用戶名(主鍵),密碼,電子郵件,網站)我有一個條目模型(ID,標題,內容,評論,commentCount)

用戶只能對條目進行一次評論。 這樣做的最佳和最有效的方法是什么?

目前,我正在考慮另一個具有用戶名(來自用戶模型)和條目ID(來自條目模型)的表

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

然后列出條目4的注釋,它搜索id = 4。

旁注:除了存儲commentCount之外,每次需要時從數據庫計算注釋計數會更好嗎?

你到底是什么意思

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

(強調我的)? 由於您看起來每個實體都有多個注釋,因此它們應存儲在單獨的表中:

comments(id, entry_id, content, user_id)

entry_iduser_id是各個表的外鍵。 現在您只需要在( entry_iduser_id )上創建一個唯一索引,以確保用戶每個實體只能添加一個注釋。

此外,您可能希望為users表創建代理(數字,通過序列/標識生成)主鍵,而不是將用戶名設置為PK。

  1. 我不會將用戶名用作主要ID。 我會用autoincrement創建一個數字id
  2. 我會在關系表中使用新的id,並在2個字段上使用唯一鍵

你的設計基本上是合理的。 您的第三個表應該被命名為UsersEntriesComments,其字段為UserName,EntryID和Comment。 在此表中,您將擁有一個由UserName和EntryID字段組成的復合主鍵; 這將強制執行每個用戶只能對每個條目進行一次注釋的規則。 該表還具有外鍵約束,使得UserName必須位於Users表中,並且EntryID必須位於Entries表中(具體而言,ID字段)。

您可以向Users表添加ID字段,但許多程序員(包括我自己)主張盡可能使用“自然”鍵。 由於UserNames在您的系統中必須是唯一的,因此這是一個完全有效(且易於閱讀)的主鍵。

更新 :再次閱讀您的問題。 您不需要條目表中的注釋或CommentsCount字段。 注釋將正確存儲在UsersEntriesComments表中,並且計數將在您的查詢中動態計算(從而節省了自己更新此值的麻煩)。

更新2 :詹姆斯布萊克贊成使用UserName作為主鍵,而是在表中添加一個人工主鍵(UserID或其他類似的東西)。 如果您使用UserName作為主鍵,則允許用戶更改其用戶名更加困難,因為您還必須更改所有相關表中的用戶名。

以下是我對您的數據模型的建議:

USERS

  • USER_ID(pk,int)
  • 用戶名
  • 密碼
  • 電子郵件
  • 網站

進入

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

ENTRY_COMMENTS

  • ENTRY_ID(pk,fk)
  • USER_ID(pk,fk)
  • 評論

此設置允許ENTRY有0+評論。 添加注釋時,主鍵是ENTRY_IDUSER_ID的復合鍵意味着該對只能在表中存在一次(IE:1,1不允許1,1再次添加)。

不要在表中存儲計數 - 使用VIEW,以便可以在執行時根據現有數據生成數字。

即使它不在問題中,您可能希望擁有主鍵的用戶標識,否則如果允許用戶更改其用戶名或使某些人知道您無法更改用戶名將很困難。

使聯接表對userid和entryid具有唯一約束。 這樣,數據庫強制只有一個注釋/條目/用戶。

如果你指定了一個數據庫,順便說一句,這會有所幫助。

聽起來你想要保證注釋集對於 username X 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!
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM