2012-02-10 4 views
0

データベースのセットアップを想像してください。ここで、x個の顧客はy個の注文をすることができます。 通常、すべての顧客は1組の自動増分注文IDを共有します。カスタマーIDごとに個別の注文IDを持つにはどうすればいいですか?

  • 顧客Aの最初の順序は、顧客BのオーダーID#1
  • 最初の注文は、注文番号#2を有しています。

私は、顧客ごとに個別の注文IDを設定したいと考えています。他の多くの顧客が発注したIDに基づいて顧客が見ることができないことは重要です。顧客Aの

  • 最初の注文は、顧客AのオーダーID#1
  • 二次は、顧客BのオーダーID#2
  • 最初の順序は、今注文番号#1

を有していました私が見ることができる唯一の方法は、顧客の注文番号の最大値を手動で選択し、+1を加えて手動で挿入することです。

select max(customer_order_id) from orders where customer_id = X 

どのようにデータの整合性と正規化の意味でこのアプローチを作成できますか?顧客の個々の注文IDに何らかの自動インクリメントがあるようなものですか?

create table customers 
(
    id int auto_increment primary key, 
    name varchar(255) 
); 

create table orders 
(
    id int auto_increment primary key, 
    customer_id int 
    customer_order_id int 
    foo varchar 
    bar varchar 
); 

答えて

1

注文番号に顧客番号とそれに続く一連番号を付けてください。だから私が顧客103985の場合、私の最初の注文は103985-0001、私の2番目の注文は103985-0002です。データを標準化し、顧客番号とシーケンス番号を別々に保管します。それらを組み合わせて表示します。

+0

ええ、返信いただきありがとうございます。私は質問が残っている:どのように適切にmax()を選択せず​​にphpで+1を追加し、それを挿入せずに、顧客ごとに別々のシーケンスを増やすのですか? – user1201008

+0

お客様のレコードで「最後の注文シーケンス」を追跡できますが、maxを選択して追加することをお勧めします。 –

+0

大丈夫、ありがとう! – user1201008

0

基本的なリレーショナル構造や単純にスラッグフィールドを選択したいと思うようです。

したがって、注文テーブルには顧客にトランスペアレントな自動増分IDを付けることができます。どのようにデータを提供するかによって、ユーザーデータを結合して正しいレコードを見つけるスラグシステムを簡単に使用することができます。

たとえば、uresに基づくリクエスト - somesite.com/orders/{user_id}/1は、ユーザーIDがログインしているユーザーで、スラグの注文は1です。{user_id}は存在する可能性がありますページの表示を許可する方法によって異なります。ですから、管理者はvarsを取​​得し、非管理者はこのvarに対して検証する必要がありますが、それはポイントの横にある可能性があります。

また、varcharを使用して注文IDを処理し、完全に解読不能な文字列を作成することもできます。あなたのサイトの規模にもよるが、これは問題ではないかもしれない。

あなたの唯一の懸念は、ユーザーBが100の注文IDを持っていることです。以前に99の他の注文があったことを知らせたくないのですか?もしそうなら、ここの答えのどれかがあなたのために働くでしょう。

+0

ご返信いただきありがとうございます。私は単に、各顧客が注文番号1,2,3 .... 100のきれいな別々のシーケンスを持つことを望みます。私は単にmax()を選択せず​​にphpで+1を追加し、それを挿入することなく、顧客ごとに個別のシーケンスを適切にインクリメントする方法を知りませんか? – user1201008

0

InnoDBをMyISAMに使用することにはいくつかの利点がありますが、MyISAMエンジンを使用している場合は、自動生成複合主キーを持つことができます。

dev.mysqlから。COM:example-auto-increment.html:あなたは複数列のインデックス二列AUTO_INCREMENTを指定することができますのMyISAMとBDBテーブルでは

。この場合、AUTO_INCREMENT列の生成値はMAX(auto_increment_column) + 1 WHERE prefix=given-prefixと計算されます。これは、データを順序付けられたグループに入れたい場合に便利です。あなたのケースでは

、それはこのようなものになるだろう:あなたはInnoDBのと同じ機能をしたい場合は、トリガを使用する必要があります

CREATE TABLE customers 
(
    id int auto_increment PRIMARY KEY, 
    name varchar(255) 
); 

CREATE TABLE orders 
(
    customer_id int, 
    customer_order_id int auto_increment, 
    ... 
    PRIMARY KEY (customer_id, customer_order_id) 
); 

関連する問題