2016-05-10 17 views
2

追加/編集/削除されたメモを追跡するSQLテーブルを作成します。私はこの時点で各NOTEIDの状態をテーブルに表示し、選択したノートの変更のログを表示し、与えられたすべてのノートを削除することができるようにしたいと考えていますNOTEIDSQLテーブルの主キーの選択

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としてプライマリIDを自動生成するか(NOTEIDTIMEMODIFIED)する必要がありますか?どのような偽の証明の保護を追加する必要がありますか?


すべてのメモを[メモ履歴]ウィンドウに表示したいと考えています。それで、3日前、作成時のメモ、2日前のメモ、修正された今日のメモを保存する必要があります。

ただし、「Notes」テーブルには各NOTEIDの最終状態が表示されます。つまり、

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

私はあなたのcreatedbyとtimecreatedは冗長だと思います。一番早くタイムモディファイドされた値を持つレコードは、作成された時刻になります。 –

答えて

3

最善の方法は2つのテーブルを作成することです。あなたのノートは

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. 
+0

両方のテーブルで 'NOTE'を複製している場合は、複数のノートを持つことができるテーブルを1つだけ持つこともできます。 –

+0

私はこれが好きです。実際、それが私のやり方です。主キーは、履歴テーブルの外部キーでもあります。 –

+0

@TimBiegeleisen複数のテーブルが必要です。なぜなら、最初のノートでは、新しいノートのためにオートノートから「NOTE_ID」が得られるからです。 2番目のものでは、それを参照します。また、元の 'NOTE'ファイルしか保存しません。 –

1

を追加取得することができます

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 
)  

NOTEIDプライマリキーとautoをインクリメントします。私は(NOTEID, TIMEMODIFIED)のコンポジット主キーを理想的にはテーブルに一度しか表示しないでください。変更された時間が変更された場合、IDは同じままでなければなりません。

ノートをコンピュータ上のファイルとして扱うと仮定すると、ノートを格納するテーブル(ファイルシステム)は1つだけである必要があります。特定の音符が変更された場合、タイムスタンプはこれを反映するように変更されます。

+0

おそらく何らかの種類の監査テーブルが必要になるでしょう。時間の経過とともに 'NOTE'の変更が追跡されることがあります。そのため、' NOTE_ID'からPKを分離する必要があるかもしれません –

1

単純な答え:

PRIMARY KEYがユニークで、テーブル内の各行を識別する値である必要があります。具体的なケースでは、NOTEIDがあなたのIDである必要があります。

エラボ:

SELECT * FROM table WHERE NOTEID = something 

クエリは多くのことを実行します:

PRIMARY KEYはあなたがに似たクエリを実行するたびにすることを意味し、デフォルトでは、インデックスを作成することを覚えておくことが重要ですインデックスがない場合よりも速く(これは主に大きなテーブルに関係します)。 PRIMARY KEYも一意であることを余儀なくされ、それ故に何の2つの行が同じPRIMARY KEY

を持つことはできません一般的なルールは、あなたが、多くの場合、文のWHERE ...一部内で使用される任意の値のINDEXを持つべきであるということです。クエリのWHERE ....部分でNOTEIDを使用する唯一の値でない場合は、さらにインデックスを作成することを検討してください。

注意してください。インデックスはSELECTで検索速度を向上させますが、UPDATEINSERTの処理速度が低下します。

関連する問題