[英]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.