[英]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還是應該使用( NOTEID
, TIMEMODIFIED
)作為主鍵? 應該添加哪種防呆保護?
我希望能夠在“便箋歷史”窗口中顯示所有便箋。 因此,我應該存儲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
加快搜索速度,但是它們會使UPDATE
和INSERT
工作變慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.