与两个实体共享地址表

时间:2016-08-03 15:24:25

标签: mysql database foreign-keys

我的数据库中有两个实体都需要地址。客户可以拥有多个地址。餐馆可以为每个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;

1 个答案:

答案 0 :(得分: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;

我是否还建议您为users表设置一个自动递增ID字段?这将导致一个较小的索引,以及通过表的较小索引。