Najrozsądniej byłoby to wykorzystać, gdyby istniały dwie odrębne koncepcje, które zawsze odnosiłyby się tylko w ten sposób. Na przykład, samochód może mieć tylko jednego aktualnego Kierowcę, a Kierowca może prowadzić tylko jeden samochód na raz - więc związek między koncepcjami Samochód i Kierowca będzie wynosił 1 do 1. Akceptuję, że jest to wymyślony przykład pokazujący punkt.
Innym powodem jest to, że chcesz specjalizować koncepcję na różne sposoby. Jeśli masz tabelę Person i chcesz dodać koncepcję różnych typów osób, takich jak Pracownik, Klient, Akcjonariusz - każda z nich będzie potrzebować innego zestawu danych. Dane, które są między nimi podobne, znajdowałyby się w tabeli Osoba, informacje specjalistyczne znajdowałyby się w tabelach dla Klienta, Akcjonariusza, Pracownika.
Niektóre silniki baz danych mają problemy z wydajnym dodawaniem nowej kolumny do bardzo dużej tabeli (wielu wierszy) i widziałem, jak tabele rozszerzeń zawierają nową kolumnę, a nie nową kolumnę dodawaną do oryginalnej tabeli. Jest to jedno z bardziej podejrzanych zastosowań dodatkowych tabel.
Możesz również zdecydować o podzieleniu danych dla jednej koncepcji między dwie różne tabele ze względu na problemy z wydajnością lub czytelnością, ale jest to dość szczególny przypadek, jeśli zaczynasz od zera - te problemy pojawią się później.
Po pierwsze, myślę, że jest to kwestia modelowania i definiowania, co składa się na odrębną całość. Załóżmy, że masz
customers
jednego i tylko jednego singlaaddress
. Oczywiście możesz zaimplementować wszystko w jednej tabelicustomer
, ale jeśli w przyszłości pozwolisz mu mieć 2 lub więcej adresów, będziesz musiał to zmienić (nie jest to problem, ale podjąć świadomą decyzję).Przychodzi mi też do głowy ciekawy przypadek, o którym nie wspomniano w innych odpowiedziach, w którym podział tabeli może być przydatny:
Wyobraź sobie, znowu, że masz
customers
po jednymaddress
, ale tym razem posiadanie adresu jest opcjonalne. Oczywiście można to zaimplementować jakoNULL
zbiór kolumn, takich jakZIP,state,street
. Ale załóżmy, że biorąc pod uwagę, że masz adres państwo nie jest obowiązkowe, ale ZIP. Jak to wymodelować w jednej tabeli? Mógłbyś użyć ograniczenia nacustomer
tabeli, ale znacznie łatwiej jest podzielić w innej tabeli i nadać parametr Foreign_key wartość NULL. W ten sposób twój model jest znacznie bardziej wyraźny, mówiąc, że jednostkaaddress
jest opcjonalna i żeZIP
jest opcjonalnym atrybutem tej jednostki.źródło
W moim czasie programowania spotkałem się z tym tylko w jednej sytuacji. Dzieje się tak, gdy istnieje relacja 1 do wielu i 1 do 1 między tymi samymi 2 podmiotami („Jednostka A” i „Jednostka B”).
Gdy „Podmiot A” ma wiele „Podmiotów B”, a „Podmiot B” ma tylko 1 „Podmiot A”, a „Podmiot A” ma tylko 1 aktualny „Podmiot B”, a „Podmiot B” ma tylko 1 „Podmiot A”.
Na przykład samochód może mieć tylko jednego aktualnego kierowcę, a kierowca może prowadzić tylko jeden samochód na raz - więc związek między koncepcjami samochodu i kierowcy wynosiłby 1 do 1. - Ten przykład zaczerpnąłem z odpowiedzi @Steve Fenton
Gdzie kierowca może prowadzić wiele samochodów, ale nie w tym samym czasie. Zatem encje Samochód i Kierowca to 1-do-wielu lub wiele-do-wielu. Ale jeśli musimy wiedzieć, kto jest obecnym sterownikiem, potrzebujemy również relacji 1 do 1.
źródło
Innym przypadkiem użycia może być przekroczenie maksymalnej liczby kolumn w tabeli bazy danych. Następnie możesz dołączyć do innego stołu za pomocą OneToOne
źródło