MySQL - jak określić typ relacji przy jej definiowaniu

0

Czy jest polecnei definiujące typ relacji (OneToOne, OneToMany itd) aby tabele uzyskiwały ten rodzaj relacji?
Stworzyłem sobie tabelę klienta i tabelę adres napisałem do nich powiązanie relacyjne klient>>adres przez FK. Gdy potem z tych dwóch tabel tworzę sobie model do podglądu to tabele połączone są relacją "wiele : 1" (klient do adresu) a chciałem mieć 1:1.
Oto mój kod:

ALTER TABLE `baza_test_1`.`client` ADD COLUMN `Address_ID_fk` INT NOT NULL  AFTER `Surname` , 
  ADD CONSTRAINT `fk_Address_ID`
  FOREIGN KEY (`Address_ID_fk` )
  REFERENCES `baza_test_1`.`address` (`Address_ID` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

W tabeli „client” z bazy danych baza_test_1 dodaję kolumnę Address_Id_fk (int, not null) po kolumnie „Surname”. Dodaje Constraint „fk_Address_ID”. Określam kolumnę która ma zawierać Foreign Key: „address_ID_fk”. Określam wiązanie do kolumny tabeli w której Foreign Key jest kluczem głównym:

REFERENCES `baza_test_1`.`address` (`Address_ID` )  // baza_test_1, tablica “address”, kolumna Address_ID 

Definiuję akcje dla tej relacji:

  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

Gdzie tu jest określenie rodzaju relacji (lub gdzie je dodać)?

0

Nie wiem, w czym sobie tworzysz "model do podglądu", ale teraz jest poprawnie wiele : 1, bo wiele rekordów może mieć sam Addres_ID_fk. Stąd wniosek, że gdyby ta kolumna była dodatkowo UNIQUE, to być może twoje narzędzie do "tworzenia modelu do podglądu" odszukało się w tym relacji 1:1.
Tak przy okazji, NO ACTION to jest raczej zbędna rzecz?

0

W Workbenchu robię podgląd modelu. Ale zaznaczenie Unique dla kolumny klucza obcego nie spowodowało u mnie zmiany typu relacji z "wiele : 1" na "1 : 1" Stworzyłem sobie trzecia tabelę "order" i już na diagramie powiązałem ją sobie z klientem relacja 1 : 1 (tabela order ma fk z client). Ale jak teraz patrzę na podgląd tej tabeli to dodany (automatycznie) foreign key z tabeli clienta nie ma zaznaczonej opcji "Unique" a relacja jest i tak 1 : 1.
To definiowanie typu relacji musi być chyba gdzieś indziej ujęte. Tylko gdzie ?

0

Tu http://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html piszą coś o "vertical toolbar on the left side of an EER Diagram" do definiowania typu relacji. Co innego, że na obrazku będziesz miał tak, ale fizycznie nadal da się zrobić inną wiele : 1 bez unique (chcoiaż to prawdopodobnie błahostka niewarta wprowadzania unique w końcowej aplikacji).

0

Ten toolbar to jest podstawowe narzędzie graficzne do tworzenia relacji i właśnie z niego korzystałem tworząc relacje 1 : 1 do tablicy order z tablicy client. Chodzi mi o to jak teraz taką relację odwzorować w kodzie gdybym chciał w konsoli mysql (wiersz poleceń) z ręki stworzyć nową tabelę i powiązać ją relacją z już istniejącą. A może unika się wpisywania relacji w konsoli?
Pobrałem teraz kod obu tablic (order i client) w diagramie (można kliknąć na daną tabelę i skopiować generujący ją kod SQL ). Porównuj je bo jedna ma relacje 1 : 1 (order-client) a druga wiele : 1 (client - address). Wygląda to tak:

Tabela client:

 
CREATE  TABLE IF NOT EXISTS `baza_test_2`.`client` (
  `Client_ID` MEDIUMINT(9) NOT NULL AUTO_INCREMENT ,
  `Name` VARCHAR(45) NOT NULL ,
  `Surname` VARCHAR(45) NOT NULL ,
  `Address_ID_fk` INT(11) NOT NULL ,
  PRIMARY KEY (`Client_ID`) ,
  CONSTRAINT `fk_Address_ID`           ** // druga ciekawostka**
    FOREIGN KEY (`Address_ID_fk` )
    REFERENCES `baza_test_2`.`address` (`Address_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 4
DEFAULT CHARACTER SET = utf8

Tabela order:

 
CREATE  TABLE IF NOT EXISTS `baza_test_2`.`order` (
  `order_ID` INT NOT NULL AUTO_INCREMENT ,
  `order value` INT NOT NULL ,
  `client_Client_ID` MEDIUMINT(9) NOT NULL ,
  PRIMARY KEY (`order_ID`) ,
  INDEX `fk_order_client1` (`client_Client_ID` ASC) ,      **// tu jest różnica w stosunku do pierwszej tabeli decydująca o relacji 1:1 **
  CONSTRAINT `fk_order_client1`                                  **// druga ciekawostka**
    FOREIGN KEY (`client_Client_ID` )
    REFERENCES `baza_test_2`.`client` (`Client_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

Wygląda na to że wiersz z poleceniem INDEX powoduje zdefiniowanie relacji 1:1. Mam taki dość dobry słownik tagów (poleceń) SQL ale polecenia INDEX tam nie ma więc nie wiem jak sie je stosuje. Masz jakieś info o tym?
Zobacz jeszcze wiersz oznaczony jako "//druga ciekawostka" bo też nie rozumiem za bardzo jego sensu. Jest to definiowanie nazwy elementu Constraint (wymuszenia) ? Ja tej nazwy fk_Address_ID nie podawałem więc jest ona generowana automatycznie, tylko po co ?

0

Ten tag INDEX to też chyba nie to bo widzę że inne tabele z relacją wiele : 1 (widoczną na diagramie) też go używają.

1 użytkowników online, w tym zalogowanych: 0, gości: 1