idcustomer を auto_increment として追加することを考えていましたが、それが素晴らしいアイデアになるかどうかはわかりません。
それは確かに良い考えです。
他の列 (属性) は、必ずしも一意の値を持つとは限りません。つまり、自然な主キーとして使用するのには適していません。自然な主キーとしてどのような値が機能するでしょうか? おそらく従業員番号。製品のシリアル番号が有効な場合があります。納税者番号 (社会保障番号) は機能しません。驚くほど多くの人が誤って重複した番号を使用しています。実世界の項目を主キーとして選択するための一意性の基準は非常に高いため、ほとんどのデータベース設計者はそれを試みることさえしません。
そのため、一意性が保証された主キーを作成することは、一般的に優れた設計です。この種のキーの専門用語は代理主キーです。MySQL を含むほとんどの DBMS システムは、その目的のために自動インクリメント番号を提供します。
id
その値に名前を付けるための 2 つの規則のいずれかを選択できます。1つはそれを呼び出すことid
です。もう1つはそれを呼び出すことですcustomer_id
(テーブル名に_id
追加)。2 つ目は、他のテーブルでこれらの値を使用して関係を確立するときに、物事を整理するのに役立ちます。
たとえば、sales テーブルがあるとします。そのテーブルには、次の列が含まれる場合があります。
sales_id autoincrementing pk
customer_id the id of the customer to whom the sale was made. (foreign key)
item_sold description of the item
list_price
discount
net_price
あなたはアイデアを得る。主キーと外部キーについて読んでください。「論理データベース設計」という専門用語では、エンティティ(顧客、販売) と関係について読むことができます。各テーブルは、独自の一連の自動インクリメント値を取得します。
次に、このようなクエリを使用して、各顧客への売上を調べることができます。
SELECT customer.name, customer.first_lastname,
COUNT(sales.sales_id) number_of_sales,
SUM(sales.net_price) revenue
FROM customer
JOIN sales ON customer.customer_id = sales.customer_id
GROUP BY customer.customer_id, customer.name, customer.first_lastname
ここで、sales
エンティティはエンティティと多対 1 の関係にありcustomer
ます。これは、顧客を指す各行のcustomer_id
属性を持つことによって実装されます。sales
また、id を各テーブルの最初の列にするのも規則です。
慣習は良いものです。次の人があなたのアプリケーションを見るのに役立ちます。未来の自分にも役立ちます。
注: 私の sales テーブルは、id 値の自動インクリメントがどのように役立つかを示すための単なる例です。これが実際の販売テーブルに適したレイアウトだとは言いません。そうではありません。