0

InnoDBに移行するための外部キーの設定についてサポートが必要です。状況は、私が3つのテーブルを持っているということです:仕事、顧客、連絡先。

ジョブは顧客に属し、ジョブは連絡先に属します。顧客には多くの仕事があり、多くの連絡先があります。連絡先は顧客に属し、多くのジョブがあります。選択した顧客に属する連絡先のみを挿入できるように、ジョブテーブルに外部キーを設定するためのサポートが必要です。(つまり、顧客Aに連絡先A1とA2があり、顧客Bに連絡先B1がある場合、ジョブの顧客として顧客Aを選択すると、A1またはA2以外の連絡先のエントリは拒否されます)。これは外部キーで行うことができますか、それとも選択したプログラミング言語で検証を行う必要がありますか?

これが私のスキーマです:

CREATE TABLE jobs(
  job_id INT(11) NOT NULL AUTO_INCREMENT,
  customer_id INT(11) DEFAULT NULL,
  contact_id INT(11) DEFAULT NULL,
  job_number INT(11) UNSIGNED NOT NULL DEFAULT 0,
  status_void TINYINT(1) DEFAULT 0,
  PRIMARY KEY (job_id),
  INDEX active_jobs (job_number, status_void),
  INDEX customer_id (customer_id),
  UNIQUE INDEX job_number (job_number),
  CONSTRAINT FK_jobs_contacts_contact_id FOREIGN KEY (contact_id)
  REFERENCES contacts (contact_id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT FK_jobs_customers_customer_id FOREIGN KEY (customer_id)
  REFERENCES customers (customer_id) ON DELETE SET NULL ON UPDATE CASCADE
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;`

CREATE TABLE customers(
  customer_id INT(11) NOT NULL AUTO_INCREMENT,
  inactive TINYINT(1) DEFAULT 0,
  customer_name VARCHAR(50) NOT NULL DEFAULT '',
  PRIMARY KEY (customer_id),
  UNIQUE INDEX customer_name (customer_name),
  INDEX inactive (inactive)
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

CREATE TABLE contacts(
  contact_id INT(11) NOT NULL AUTO_INCREMENT,
  customer_id INT(11) DEFAULT NULL,
  inactive TINYINT(1) DEFAULT 0,
  first_name VARCHAR(50) DEFAULT NULL,
  last_name VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (contact_id),
  UNIQUE INDEX contact_key (customer_id, last_name, first_name),
  INDEX customer_id (customer_id),
  INDEX inactive (inactive),
  INDEX name (last_name, first_name),
  CONSTRAINT fk_contacts_customers_customer_id FOREIGN KEY (customer_id)
  REFERENCES customers (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

私が持っているもう1つの目標は、無効ではないすべてのジョブ(status_void = 0)と非アクティブではないすべての顧客と連絡先(inactive = 0)を一覧表示するようにインデックスを設定することです。この場合、複数列のインデックス(ジョブ)または2つの個別のインデックス(顧客/連絡先)が役立つかどうかはわかりません。

私はまだ学んでいるので、気楽にやってください。お時間をいただきありがとうございます。

4

1 に答える 1

0

これは外部キーで行うことができますか?それとも、選択したプログラミング言語で検証を行う必要がありますか?

はい、はい。

これは、FK がデータに追加する参照整合性です。ただし、アプリケーションでそれを考慮しないと、ユーザーが顧客に属していない連絡先を入力し、それを DB に送信した後にエラーが発生するという恐ろしいユーザー エクスペリエンスが発生します。アプリケーションでこれを考慮して、その状況がDBに送信されないようにすることをお勧めします.FKは、何らかの形で通過した場合のバックアップのようなものです.

もう 1 つの目標は、無効ではない (status_void=0) すべてのジョブと、非アクティブ (inactive=0) ではないすべての顧客と連絡先を一覧表示するようにインデックスを設定することです。この場合、複数列のインデックス (ジョブ) または 2 つの個別のインデックス (顧客/連絡先) が役立つかどうかはわかりません。

どのインデックスを作成するかは、クエリ固有になる傾向があります。したがって、最終的な目標が何であるかだけでなく、インデックス作成に関するアドバイスを得るのに最適なクエリの例を示したいと思うでしょう。クエリのテーブル参照ごとに使用できるインデックスは 1 つだけであることに注意してください。そのため、テーブルの where 句に複数のフィルターがある場合、複数列のインデックスを使用することで最高のパフォーマンスが得られる傾向があります。

インデックスを計画するときは、どの列の一意の値が少ないかを考えて、より多くの行を除外し、それらをインデックスの最初にリストすることをお勧めします。

とはいえ、代表的なクエリとそれに関する Explain ステートメントの結果がなければ、部外者はインデックスについてアドバイスすることはできません。インデックスの有効性は、インデックスが使用されているデータに依存するためです。

于 2012-11-06T01:18:37.953 に答える