簡體   English   中英

在SQL表中選擇主鍵

[英]Choice of a primary key in SQL table

我想制作一個SQL表來跟蹤添加/編輯/刪除的注釋。 我現在希望能夠在表格中顯示每個NOTEID的狀態,顯示所選筆記的更改日志,並能夠刪除所有標記有給定NOTEID

create table[dbo].[NOTES]{
  NOTEID [varchar](128) NOT NULL,
  CREATEDBY [varchar](128) NOT NULL, /*is this redundant?*/
  TIMECREATED  DATE NOT NULL,          /*is this redundant?*/
  MODIFIEDBY [varchar](128) NOT NULL,
  TIMEMODIFIED  DATE NOT NULL,
  NOTE [VARCHAR}(2000) NULL,
  PRIMARY KEY ( /* undecided */ ),
}; 

制作這張桌子的自然方法是什么? 我應該自動生成主ID還是應該使用( NOTEIDTIMEMODIFIED )作為主鍵? 應該添加哪種防呆保護?


我希望能夠在“便箋歷史”窗口中顯示所有便箋。 因此,我應該存儲3天前創建的便箋,2天前以及今天修改后的便箋。

但是,“注釋”表將顯示每個NOTEID的最終狀態。 那是

SELECT NOTE from NOTES where NOTEID = 'selected_note_id' and date = latest

最好的方法是創建兩個表。

 NOTES (
     NOTE_ID        -- primary key and autogenerated / autonumeric
     CREATEDBY      -- only appear once
     TIMECREATED    -- only appear once
     NOTE 
 )

 NOTES_UPDATE (
     NOTES_UPDATE_ID   -- primary key and autogenerated / autonumeric
     NOTE_ID           -- Foreign Key to NOTES
     MODIFIEDBY 
     TIMEMODIFIED  
     NOTE 
 )     

您可以更新筆記

 SELECT N.*, NU.*
 FROM NOTES N
 JOIN NOTES_UPDATE NU
   ON N.NOTE_ID = NU.NOTE_ID

並獲取最新更新,只需添加

 ORDER BY NOTE_UPDATE_ID DESC
 LIMIT 1   -- THIS is postgres sintaxis.

我認為您當前的表設計很好,盡管您可能希望將NOTEID作為主鍵並自動對其進行遞增。 我看不到要制作(NOTEID, TIMEMODIFIED)復合主鍵的意義,因為理想情況下,給定的音符ID在表中應該只出現一次。 如果修改的時間更改,則ID應該保持不變。

假設我們將便箋視為計算機上的文件,則應該只有一個表(文件系統)來存儲便箋。 如果給定的注釋被修改,則時間戳更改以反映此情況。

簡單的答案:

PRIMARY KEY應該是唯一標識表中每一行的值。 在您的特定情況下, NOTEID應該是您的ID。

闡述:

重要的是要記住,默認情況下, PRIMARY KEY創建一個索引,這意味着每當您執行類似以下查詢時:

SELECT * FROM table WHERE NOTEID = something

查詢將比沒有索引時執行得快得多(這與較大的表最相關)。 PRIMARY KEY也被強制為唯一,因此任何兩行都不能具有相同的PRIMARY KEY

一般規則是,對於該語句的WHERE ...部分中經常使用的任何值,都應該有一個INDEX 如果NOTEID不是您將在查詢的WHERE ....部分中使用的唯一值,請考慮創建更多索引

然而! 謹慎行事。 索引有助於通過SELECT加快搜索速度,但是它們會使UPDATEINSERT工作變慢。

暫無
暫無

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

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