![]() |
![]() |
![]()
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ł? |
|
|
![]() |
![]()
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ć
![]() 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 |
|
|
![]()
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_". |
|
|
![]()
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 ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 348 Pomógł: 26 Dołączył: 8.10.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
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...
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 23:04 |