2016-08-03 82 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

太好了,谢谢!我会继续实施这个。如果一切都很好,我会将其标记为已回答,欢呼! –