Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Relacyjne bazy danych.
cykcykacz
post
Post #1





Grupa: Zarejestrowani
Postów: 550
Pomógł: 9
Dołączył: 29.05.2009
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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ł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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_".
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Adi32
post
Post #5





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 23:04