テーブルとテーブルを繋ぐユニークキーの作り方は?
Excelで以下のような表をデータベースにした場合についてお伺いします。
【Excel表】--------------------------------------
購入日 , 店舗, 商品名1 , 商品名2, 商品名3
2014/4/1, A店, ボールペン, ノート , えんぴつ
2014/4/2, B店, ハンカチ , 洋服 , くつした
-------------------------------------------------
まず第一正規形は以下のようになると思います。
【第一正規形】-----------------------------------
購入日 , 店舗, 商品名
2014/4/1, A店, ボールペン
2014/4/1, A店, ノート
2014/4/1, A店, えんぴつ
2014/4/2, B店, ハンカチ
2014/4/2, B店, 洋服
2014/4/2, B店, くつした
-------------------------------------------------
第二正規形は以下のように重複している部分を別のテーブルにします。
【第二正規形】-----------------------------------
tb_purchase
購入日 , 店舗コード, 商品名
2014/4/1, 1 , ボールペン
2014/4/1, 1 , ノート
2014/4/1, 1 , えんぴつ
2014/4/2, 2 , ハンカチ
2014/4/2, 2 , 洋服
2014/4/2, 2 , くつした
tb_shop
店舗コード, 店舗
1 , A店
2 , B店
-------------------------------------------------
質問1.
ここで疑問に思ったのですが、このようにtb_shopの「店舗コード」は実際にはどのようにして作成するのでしょうか?
tb_shopには重複しない「店舗コード」が必要ですが、それにはAUTO_INCREMENTを使うのが一般的なのでしょうか?
質問2.
実際の挿入時のクエリーは以下のような感じで良いのですか?
1.「2014/4/3にA店で消しゴムを買った」というデータを挿入する場合
1. tb_shopで店舗カラムが「A店」となる店舗コードを取得
2. tb_purchaseに「2014/4/3, 1, 消しゴム」を挿入
こんな感じでしょうか?
2.「2014/4/3にC店で牛乳を買った」というデータを挿入する場合(1~4はそれぞれ一つのクエリーです)、
1. tb_shopで店舗カラムが「C店」となる店舗コードを取得
2. C店が存在しないのでtb_shopに挿入
3. 挿入後に「C店」となる店舗コードを取得
4. tb_purchaseに「2014/4/3, 3, 牛乳」を挿入
なんか手間が増えますが、1~3はそれぞれ別々のクエリーでやらないとダメでしょうか?
質問3.
あと質問ですが、このままだとtb_purchaseは主キーがないので、購入idのようなカラムは必要ですよね?
主に聞きたい内容は上記の「店舗コード」なる、テーブルとテーブルを繋ぐコードのようなものは
どのように作るのが一般的で同時挿入でも重複しないコードを作れるか?という点です。
自前でたとえば「S001, S002, …」というようなコードを作ったら、同時挿入で問題が出ますよね?
初心者的な質問ですみませんが、どうぞよろしくお願い致します。
お礼
ご回答ありがとうございます。 Accessで入力フォームを作る時に正規化しない方が作りやすかったのでそっちでやりたくなってしまいました。でも仰るとおりエラーチェックが面倒ですね。 >MAXを利用してグループ化すれば正規化しないイメージのレイアウトでデータは簡単に取得できます。 そうなんです、一行でペタッと表示したかったんです。SQLでレイアウトは何とかなるんですね。 正規化する方でやってみようと思います。 ありがとうございました。