在SQL表中选择主键

时间:2016-05-10 14:27:50

标签: database primary-key-design

我想创建一个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)作为主键?应该添加什么样的防呆保护?

我希望能够在" Note history"中显示所有音符。窗口。因此,我应该存储3天前的信息,当它被创建时,请注意2天前和今天,当它被修改时。

然而," Notes" table将显示每个NOTEID的最终状态。那是

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

3 个答案:

答案 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的搜索速度,但会使UPDATEINSERT的工作速度变慢。