2011-07-28 7 views
0

私はスタンプ収集Webアプリケーションを構築し始めています。 Python /フラスコバックエンド(私と思う:))は、データベースとしてのMySQL。私はdbデザインについて多くのことを知らないので、私が思ったやり方で本当にばかげたミスをしたら、そのことを覚えておいてください。私は3つのテーブルにデータを分割することを考えていた。ユニークでないエントリを持つジャンクションテーブル

  • ユーザーテーブル(すべてのユーザーが、このテーブルへの登録時に添加する必要があります)
  • スタンプテーブルのuser_idとstamp_idで
  • 所有するテーブル(交差テーブルを(すべてのスタンプはここに常駐し、私だけで変更すべきです)外部キーとして)

質問:user_idとstamp_idをプライマリキーとして配置すると、このタイプのユニークなエントリが1つだけ存在します。たとえば、user_1にはcard_1があります。しかし、user_1にはcard_1が重複している可能性がありますので、2行にすることをお勧めします。 user_1 card_1 user_1 card_1 もう一つの問題は所有スタンプの状態を含めることです。例えば、user_1は、ミント状態のcard_1と悪い状態のcard_1を持つかもしれません。私が理解する限り、user_1のユニークなペアは1つしか入力できません。希望の結果を得るために私は何ができますか?これを行うより良い方法があれば、私に知らせてください。

追加の質問。私はそれが生成するSQLについての質問があるので、私はdbをプロットしようとmysqlのworkbenchを使用していた。 CONSTRAINT "fk_gibberish"は、それは普通のことですか...それはなぜですか?

CREATE TABLE IF NOT EXISTS `stampcollect`.`users` (
    `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `user_username` VARCHAR(45) NULL , 
    `user_password` VARCHAR(45) NULL , 
    `user_email` VARCHAR(45) NULL , 
    PRIMARY KEY (`user_id`)) 

CREATE TABLE IF NOT EXISTS `stampcollect`.`stamps` (
    `stamp_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `stamp_name` VARCHAR(45) NULL , 
    PRIMARY KEY (`stamp_id`)) 

CREATE TABLE IF NOT EXISTS `stampcollect`.`owned` (
    `user_id` INT NOT NULL , 
    `stamp_id` INT NOT NULL , 
    `stamp_status` BIT NULL , 
    PRIMARY KEY (`user_id`, `stamp_id`) , 
    INDEX `fk_{F5DBEF0D-24E0-4AFF-A5CB-2A6A0D448C96}` (`stamp_id` ASC) , 
    CONSTRAINT `fk_{22B4468E-A5FB-4702-A8A9-576AA48A0543}` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `stampcollect`.`users` (`user_id`), 
    CONSTRAINT `fk_{F5DBEF0D-24E0-4AFF-A5CB-2A6A0D448C96}` 
    FOREIGN KEY (`stamp_id`) 
    REFERENCES `stampcollect`.`stamps` (`stamp_id`)); 

答えて

1

ユーザーが複数の状態で同じスタンプを所有できる場合、状態は「所有」テーブルに入り、キーの一部である必要があります。もし彼が同じスタンプの複数のコピーを所有することができれば、(そのキーの一部ではなく)そのテーブルに「数量」列を持つことは理にかなっています。

+0

だから、テーブルは次のようになっているはずです:user_id stamp_id stamp_state stamp_quantity? user_id_stamp_id_state_stateを主キーにしますか? – pocorschi

0

あなたownedテーブルの上にオートインクリメントでidフィールドを追加し、主キーことを確認してください。

他の質問については、あなたの外部キーの一意のIDを生成するのはWorkbenchだけです。名前を変更することができます。名前を変更することはできません。

+0

「id」列を追加することは無関係で、何も解決しません。 – sqlvogel

+0

私はdportasが正しいと思います。ワークベンチの内容を明確にしていただきありがとうございますが、私は何をすべきか理解しており、これが本当に正しいアプローチであるかどうかを理解しています – pocorschi

+0

あなたは正しいですが、推奨される習慣で、ORMが機能するためには、 – bfavaretto

関連する問題