- PR -

ユニークIDのつけかた

1
投稿者投稿内容
BW
会議室デビュー日: 2007/06/25
投稿数: 6
投稿日時: 2008-03-10 15:00
こんにちは。
とある顧客管理DBをMySQLもしくはPostgreSQLで作ろうと思っています。

顧客データ table
client_id | client_name | status |
----------------------------------
100   | hoge    | 0
101   | piyo    | 0

取引履歴データ table
client_id | history_date
------------------------
100   | 2008-03-08
100   | 2008-02-29
101   | 2008-02-28

というような、2つのテーブルがあった場合、取引履歴データから、顧客データへ INNER JOIN してデータを引っ張ろうとしています。

SELECT * FROM 取引履歴データ INNER JOIN 顧客データ ON 取引履歴データ.client_id = 顧客データ.client_id;

ただ、顧客基本データを編集する際に「即時反映」と「承認待ち」の2つの方法を用意したいと思っています。
顧客データの status というカラムが 0 の場合は本番データ、 1 の場合は承認待ちデータという分けにした場合、即時反映の場合は、そのまま UPDATE で良いのですが、承認待ちを作る際に、顧客データをコピーして1レコード INSERT で増やさなくてはなりません。

顧客データ table
client_id | client_name | status |
----------------------------------
100   | hoge    | 0(本番データ)
101   | piyo    | 0
100   | hoge_edit  | 1(承認待ちデータ)

この場合、client_id が同じ物が存在するので、これをユニークIDとして使うことはできなくなってしまいます。こんな時は、どのような設計をするのが一般的なのでしょうか?

ちなみに、client_id は変更したくありません(取引履歴データも全てUPDATEしなくてはならないので)。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-03-10 16:46
引用:

BWさんの書き込み (2008-03-10 15:00) より:
この場合、client_id が同じ物が存在するので、これをユニークIDとして使うことはできなくなってしまいます。こんな時は、どのような設計をするのが一般的なのでしょうか?

ちなみに、client_id は変更したくありません(取引履歴データも全てUPDATEしなくてはならないので)。


client_id 列と status 列の2つの列を「複合キー」として使うことができるのではないでしょうか?
2つの列を組み合わせて、主キーにすることもできます。
kvip
会議室デビュー日: 2003/05/12
投稿数: 12
投稿日時: 2008-03-11 13:46
statusが増えることを考慮すると、枝番を加えて複合主キーとするのも手だと思います。
また、本番データと承認待ちデータのテーブルを別々に用意する手もありますね。
(承認時に本番データにデータを移す)
1

スキルアップ/キャリアアップ(JOB@IT)