0

こんにちは、私はデータベースの初心者です。このため、間違いを避けるためにどの属性を主キーとして使用する必要があるかお尋ねしたいと思います。

    CREATE TABLE customer(
    name
    first_lastname
    street
    ZIP_code
    mobile_phone
    telephone
    email
    gender
    birthdate
    nationality);

オプションで、idcustomer を auto_increment として追加することを考えていましたが、それが素晴らしいアイデアになるかどうかはわかりません。

4

5 に答える 5

4

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 値の自動インクリメントがどのように役立つかを示すための単なる例です。これが実際の販売テーブルに適したレイアウトだとは言いません。そうではありません。

于 2018-05-18T23:58:02.993 に答える
2

PRIMARY KEY にはいくつかの望ましいプロパティがあります (これらのいくつかは非常に明白ですが、列挙します)。

  • 非 null - (各行は、すべての PK 列に対して非 NULL 値を持つことが保証されています)
  • unique - (2 つの行が同じ値のセットを持つことはありません。 ever )
  • simple - (単一列、ネイティブ データ型)
  • short - (クラスター キーはすべてのセカンダリ インデックスと外部キーで繰り返されます)
  • 不変 - (一度割り当てられると、値は変更されません)
  • 匿名 - (意味のある情報は含まれていません)

これらの各プロパティ、意味と利点、およびこれらのプロパティを持たない主キーの欠点について、意見を持ち、議論することができます。しかし、多くの場合、何が最も重要で、何がまったく重要でないかについての意見になってしまいます。)

私には、これらの特性のすべてが望ましいと考える理由があります。そして、他の人が同じ意見を持っていないことを認識しています。

このリストが有効な場合、代理主キーはこれらすべてに適合します。

MySQL では、サロゲート主キーを実装する 1 つの可能な方法は、テーブルに余分な列を追加することです。

 CREATE TABLE mytable 
 ( id                INT NOT NULL AUTO_INCREMENT PRIMARY KEY  COMMENT 'PK'
 , cust_email        VARCHAR(255) NOT NULL                    COMMENT 'UX1'
 , cust_name_title
 , cust_name_first
 , cust_name_last
 , cust_name_suffix
 , cust_addr_street
 , cust_addr_line2
 , cust_addr_city
 , cust_addr_state
 , cust_addr_postal_code
 , UNIQUE KEY customer_UX1 (cust_email) 
 )

AUTO_INCREMENT の使用は必須ではないことに注意してください。これは、多くの人が便利で使いやすいと感じる機能です。(AUTO_INCREMENT については、PRIMARY KEY に関して完全ではない機能となる詳細がいくつかあります。)


重要

サロゲート主キーを使用することが正しい方法である、または唯一の方法であるとは断言しません。

代理主キーは、データベース実装プロジェクトを成功させるための要件ではありません。多くの成功したプロジェクトは、自然キーを使用して実装されています。

しかし、(最後に) 選択された自然キーが 1 つ (またはそれ以上) を満たさないことが判明したとき (プロジェクトのかなり後になって、新たに発見された要件)、自然キーの一部の断固たる信者がひどくやけどを負ったことに注意します。 )私がリストした「望ましい特性」の。

于 2018-05-19T00:00:06.837 に答える
0

主キーは、テーブル内の行を一意に識別する列または列のセットです。そのことを念頭に置いて、customer行を一意に識別する任意の列を主キーとして作成できます。電話番号、または名、姓、および電話番号の組み合わせを主キーとして使用できます。しかし、より受け入れられている方法は、追加の列を追加することです。おそらく、または単にidcustomer考えたような名前で、顧客ごとに一意であり、それを主キーにします。この整数列を作成することは良い考えです。customer_ididauto_increment

于 2018-05-19T00:02:31.320 に答える