2016-08-03 2 views
1

私はデータベースに、アドレスを必要とする2つのエンティティを持っています。顧客は複数のアドレスを持つことができます。レストランでは、IDごとに1つの住所を持つことができます。関係をどのように整理すればよいですか?私は現在、それが所属するユーザを参照するアドレステーブルを持っていますが、レストランにも属しています。2つのエンティティを持つアドレステーブルを共有する

住所:

CREATE TABLE IF NOT EXISTS grabatakeaway.address (
    `address_id` int(8) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `address` text NOT NULL, 
    `city` varchar(128) NOT NULL, 
    `state_province` varchar(128), 
    `zip_post` varchar(32) NOT NULL, 
    `username` varchar(32) NOT NULL, 
    FOREIGN KEY (username) REFERENCES grabatakeaway.user(username) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

ユーザー:

CREATE TABLE IF NOT EXISTS grabatakeaway.user (
    `username` varchar(32) NOT NULL PRIMARY KEY, 
    `password` varchar(128) NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

レストラン:

CREATE TABLE IF NOT EXISTS grabatakeaway.restaurant (
    `restaurant_id` int(8) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `address_id` int(8) UNSIGNED NOT NULL, 
    FOREIGN KEY (address_id) REFERENCES grabatakeaway.address(address_id) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

答えて

2

あなたは 'を介して' テーブルを必要としています。

CREATE TABLE IF NOT EXISTS (user_address 
     address_id int, 
     user_name varchar(32), 
     FOREIGN KEY (username) REFERENCES grabatakeaway.user(username), 
     FOREIGN KEY (address_id) REFERENCES grabatakeaway.address(address_id), 
     PRIMARY KEY (user_id,user_name)) 

アドレステーブルにユーザー名は必要ありません。

CREATE TABLE IF NOT EXISTS grabatakeaway.address (
    `address_id` int(8) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `address` text NOT NULL, 
    `city` varchar(128) NOT NULL, 
    `state_province` varchar(128), 
    `zip_post` varchar(32) NOT NULL, 
    FOREIGN KEY (username) REFERENCES grabatakeaway.user(username) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

また、ユーザーテーブルの自動増分IDフィールドがあることをお勧めしますか?これにより、それに対するインデックスが小さくなり、スルーテーブルのインデックスも小さくなります。

+0

レストランについてはどうですか?同じこと? –

+0

はい、同じものです。これにより、多対多の関係が作成され、修復者も多くのアドレスを持つことができます。必要がない場合は、現在の構造を維持してください。 – e4c5

+0

よかった、ありがとう!私は先に進んでこれを実装します。すべてが良いなら、私はこれを答えたようにマークします、歓声! –

関連する問題