我想创建一个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
)作为主键?应该添加什么样的防呆保护?
我希望能够在" Note history"中显示所有音符。窗口。因此,我应该存储3天前的信息,当它被创建时,请注意2天前和今天,当它被修改时。
然而," Notes" table将显示每个NOTEID的最终状态。那是
SELECT NOTE from NOTES where NOTEID = 'selected_note_id' and date = latest
答案 0 :(得分:3)
最好的方法是创建两个表。
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.
答案 1 :(得分:1)
我认为您当前的表设计很好,但您可能希望将NOTEID
作为主键并自动增加它。我没有看到使(NOTEID, TIMEMODIFIED)
成为复合主键的重点,因为给定的注释ID理想情况下应该只在表中出现一次。如果修改时间发生变化,则ID应保持不变。
假设我们将笔记视为计算机上的文件,那么应该只有一个表(文件系统)存储它们。如果给定的音符被修改,那么时间戳会改变以反映这一点。
答案 2 :(得分:1)
简单回答:
PRIMARY KEY
应该是唯一标识表中每一行的值。在您的特定情况下,NOTEID
应该是您的身份。
<强>阐述:强>
重要的是要记住PRIMARY KEY
默认情况下会创建一个索引,这意味着无论何时执行类似于以下的查询:
SELECT * FROM table WHERE NOTEID = something
查询的执行速度比没有索引的速度快得多(这与大型表格相关)。 PRIMARY KEY
也被强制为唯一,因此没有两行可以具有相同的PRIMARY KEY
一般规则是,对于通常在语句的INDEX
部分中使用的任何值,您应该有WHERE ...
。如果NOTEID
不是您将在查询的WHERE ....
部分中使用的唯一值,请考虑创建更多索引
无论其!谨慎小心。索引有助于加快SELECT
的搜索速度,但会使UPDATE
和INSERT
的工作速度变慢。