Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Relacyjne bazy danych.
Forum PHP.pl > Forum > Przedszkole
cykcykacz
Witam,
uczę się podstaw baz danych.
Mam za zadanie modelowanie projektu w mysql workbench.

Mam jedno pytanie, na które nie mogę sobie odpowiedzieć.

Załóżmy mamy:
Kod
CREATE TABLE customers (  
    customer_id INT AUTO_INCREMENT PRIMARY KEY,  
    customer_name VARCHAR(100)  
);  
  
CREATE TABLE orders (  
    order_id INT AUTO_INCREMENT PRIMARY KEY,  
    customer_id INT,  
    amount DOUBLE,  
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)  
);


Dwie tabele, które są połączone relacją.
Żeby wyciągnąć dane piszę zapytanie:
Kod
SELECT * FROM customers JOIN orders WHERE customers.customre_id = orders.customer_id;


Działa.

A teraz robię to samo zapytanie na tabelach, które nie mają relacji.

Kod
CREATE TABLE customers (  
    customer_id INT AUTO_INCREMENT PRIMARY KEY,  
    customer_name VARCHAR(100)  
);  
  
CREATE TABLE orders (  
    order_id INT AUTO_INCREMENT PRIMARY KEY,  
    customer_id INT,  
    amount DOUBLE
);



I zapytanie też pokazuje ten sam wynik.

Moje pytanie po co tak właściwie są te ralacje?
Żeby skrypt szybciej zadziałał?
nospor
Sam JOINujesz wiec mówisz co masz łączyć - prawidłowo. Od tego jesteś Ty by mówić bazie co chcesz a nie baza ma się domyślać smile.gif

A relacje są np. do:
1) Automatycznego usuwania rekordu z jednej tabeli, gdy zniknie odpowiednik z innej tabeli
2) Nie pozwalaniu na kasowanie rekordu z jednej tabeli, gdy ma on wiązanie w innej
3) Update rekordu na NULL, gdy jego odpowiednik zniknie z innej tabeli

Relacje nie służą do przyspieszania operacji. Od tego są indeksy.
Crozin
1. W pierwszym wypadku na kolumnie customer_id masz założony indeks, dzięki czemu wyszukiwanie jest szybsze.
2. Klucze obce umożliwiają zachowanie spójności danych przez wymuszenie poprwanych relacji (czy do kolumny customer_id nie wrzucisz nieistniejącego ID, a usuwając danego użytkownika możesz autumatycznie usunąć wszystkie jego zamówienia bądź zablokować możliwość usunięcia tak długo jak długo istnieją jakieś rekordy odnoszące się do usuwanego rekordu).
3. Google: MySQL foreign keys constraints
4. Nazwy kolumn powinny być raczej "id", "name". Nie ma potrzeby dodawania jakiegoś bezsensownego przedrostka "customer_".
nospor
Cytat
4. Nazwy kolumn powinny być raczej "id", "name". Nie ma potrzeby dodawania jakiegoś bezsensownego przedrostka "customer_".
Oczywiście mowa o tabeli customers. Bo w orders customer_id jest jak najbardziej ok smile.gif
Adi32
Cytat(Crozin @ 8.03.2013, 12:11:52 ) *
4. Nazwy kolumn powinny być raczej "id", "name". Nie ma potrzeby dodawania jakiegoś bezsensownego przedrostka "customer_".

Chyba, że ktoś lubi joinować za pomocą USING.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.