1つの例は、「file_exported」のように何かが起こったことを示すNULLタイムスタンプです。ファイルがエクスポートされ、NULL以外の値が設定された後は、そのファイルを再度NULLに設定しないでください。
もう1つの例は、ヒットカウンターです。この場合、整数は増加のみが許可されますが、減少することはできません。
どちらの場合も、これらの変更を注釈付きテーブルの属性として記録することはありません。「エクスポートされた」または「ヒット数」は明確なアイデアであり、関連するオブジェクトからの関連するが直交する実世界の概念を表します。
したがって、それらは単に異なる関係になります。「file_exported」を1回だけ発生させたいので、次のようにします。
CREATE TABLE thing_file_exported(
thing_id INTEGER PRIMARY KEY REFERENCES(thing.id),
file_name VARCHAR NOT NULL
)
ヒットカウンターも同様に別のテーブルです。
CREATE TABLE thing_hits(
thing_id INTEGER NOT NULL REFERENCES(thing.id),
hit_date TIMESTAMP NOT NULL,
PRIMARY KEY (thing_id, hit_date)
)
そして、あなたはでクエリするかもしれません
SELECT thing.col1, thing.col2, tfe.file_name, count(th.thing_id)
FROM thing
LEFT OUTER JOIN thing_file_exported tfe
ON (thing.id = tfe.thing_id)
LEFT OUTER JOIN thing_hits th
ON (thing.id = th.thing_id)
GROUP BY thing.col1, thing.col2, tfe.file_name