2016-08-03 19 views
1

Ich habe zwei Entitäten in meiner Datenbank, die beide Adressen benötigen. Kunden können mehrere Adressen haben. Restaurants können für jede ID eine Adresse haben. Wie soll ich die Beziehungen organisieren? Ich habe derzeit die Adressentabelle, die auf den Benutzer verweist, zu dem es gehört, aber es kann auch zu einem Restaurant gehören.Gemeinsame Nutzung der Adresstabelle mit zwei Entitäten

Adresse:

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; 

Benutzer:

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

Restaurant:

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; 

Antwort

2

Sie benötigen einen 'bis' Tisch.

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)) 

Sie benötigen den Benutzernamen nicht in der Adresstabelle.

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; 

Darf ich auch vorschlagen, dass Sie ein automatisch erhöhendes ID-Feld für die Benutzertabelle haben? Das führt zu einem kleineren Index und einem kleineren Index für die Durchlauftabelle.

+0

Wie wäre es mit einem Restaurant? Gleiche Sache? –

+0

ja, das Gleiche. Dies schafft eine Viele-zu-Viele-Beziehung und ermöglicht es, dass die Rückstände auch viele Adressen haben. Wenn Sie es nicht benötigen, behalten Sie die aktuelle Struktur dafür bei. – e4c5

+0

Großartig, danke! Ich werde weitermachen und dies umsetzen. Wenn alles gut ist, werde ich das als beantwortet markieren, Prost! –