0

これがテーブルの SQL コードであるとします。

CREATE  TABLE `user_is_in` (
  `id_user` INT NULL ,
  `id_city` INT NULL ,
  `when` DATETIME NULL ,
  INDEX `fk_user` (`id_user` ASC) ,
  INDEX `fk_city` (`id_city` ASC) ,
  CONSTRAINT `fk_user`
    FOREIGN KEY (`id_user` )
    REFERENCES `user` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_city`
    FOREIGN KEY (`id_city` )
    REFERENCES `city` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;

テーブルの用途は、Foursquare チェックインの種類を保存することです (ユーザーは一度に 1 つの場所に登録されました)。

今、私には2つのオプションがあります:

  • 3 つのフィールドを持ち、主キーを持たない一意のインデックスを作成します。

    一意のインデックスid_user_is_in_UNIQUE( id_userASC、id_cityASC、whenASC)

  • 追加の従来の ID 自動インクリメント フィールドを作成する

ユーザーと都市に関するクエリを作成したいので、2 番目のオプションは好きではありません (つまり、ある都市で 1 つの日付にチェックインしたすべてのユーザーを検索します)。

前もって感謝します。

4

1 に答える 1

0

両方を行う必要があります。自動インクリメント主キーを追加し、3 つの列すべてに対して一意性制約を追加します。別のシステムで割り当てられたキーを使用すると、最終的に必要になった場合に、この新しいテーブルに外部キーを簡単に定義できます。また、3 つの列すべてに対して一意性制約を設定すると、重複データが作成されなくなります。

いくつかの簡単な補足事項:

  • これは関連テーブルであるため、列は実際には である必要があります NOT NULL
  • おそらく、関連テーブルまで都市の削除を CASCADE したいと思うでしょう。
于 2012-04-19T14:18:10.040 に答える