2

我想制作一个 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 天前的笔记和今天修改的笔记。

但是,“Notes”表将显示每个 NOTEID 的最终状态。那是

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

3 回答 3

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.
于 2016-05-10T14:35:47.403 回答
1

简单的答案:

PRIMARY KEY应该是唯一标识表中每一行的值。在您的特定情况下,NOTEID应该是您的 id。

阐述:

重要的是要记住 aPRIMARY KEY默认情况下会创建一个索引,这意味着每当您执行类似于以下的查询时:

SELECT * FROM table WHERE NOTEID = something

查询将比没有索引执行得快得多(这主要与更大的表相关)。PRIMARY KEY也被迫是唯一的,因此没有两行可以有相同的PRIMARY KEY

一般规则是,您应该为语句部分中INDEX经常使用的任何值设置一个值。WHERE ...如果NOTEID不是您将在WHERE ....查询部分中使用的唯一值,请考虑创建更多索引

然而!小心行事。索引有助于加快搜索速度,SELECT但它们会使搜索速度变慢UPDATE并且INSERT工作速度变慢。

于 2016-05-10T14:40:35.633 回答
1

我认为您当前的表设计很好,尽管您可能希望创建NOTEID主键并自动递增它。我看不出制作(NOTEID, TIMEMODIFIED)复合主键的意义,因为理想情况下,给定的笔记 ID 应该只在表中出现一次。如果修改时间发生变化,则 ID 应保持不变。

假设我们将笔记视为计算机上的文件,那么应该只有一个表(文件系统)来存储它们。如果给定的注释被修改,则时间戳会更改以反映这一点。

于 2016-05-10T14:37:45.510 回答