2016-08-03 162 views
1

我的數據庫中有兩個實體都需要地址。客戶可以擁有多個地址。餐廳可以爲每個ID設置一個地址。我應該如何組織關係?我目前有地址表引用它所屬的用戶,但它也可以屬於一家餐館。與兩個實體共享地址表

地址:

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

太好了,謝謝!我會繼續實施這個。如果一切都很好,我會將其標記爲已回答,歡呼! –