Używam hasOne
w Grails jako szczególnie mylące. Na przykład, pytanie dotyczy tego, co się dzieje, gdy związek Toone jest zadeklarowana następująco:
class Person {
static hasOne = [address: Address]
}
Jak stwierdzono powyżej, powoduje person_id
klucz obcy do stawienia się w tabeli adres, co oznacza, że każdy adres może wskazywać tylko na jedna osoba. To, co uważam za dziwne, to to, że chociaż kod jest zapisany jako "Osoba ma jeden adres", faktycznym rezultatem jest to, że "Adres ma jedną osobę".
W rzeczywistości, zdefiniowane wyłącznie jak wyżej, nie ma niczego (na poziomie bazy danych), które uniemożliwiłoby wykrycie więcej niż jednego rekordu Adresacji tej samej Osobie, co oznacza, że osoba faktycznie nie musi mieć jednego adresu. .
Co ciekawe, można uzyskać taką samą reprezentację bazy jeśli stworzył klasę adresową tak:
class Address {
Person person
}
person_id
klucz obcy będzie w tabeli adresów, tak jak w poprzednim przykładzie, ale oczywiście, nie można uzyskać od osoby do adresu w kodzie, nie definiując w jakikolwiek sposób tej relacji.
Interesujące jest również to, że jeśli modelowałeś wiele relacji od osoby do adresu w bazie danych, używałbyś tego samego układu tabeli. Wstawisz klucz podstawowy rodzica (id_osobisty) do tabeli podrzędnej. Z perspektywy bazy danych, użycie hasOne
tworzy taką samą strukturę, jaką tworzy wiele relacji.
Oczywiście nie tworzymy tylko tabel bazy danych, tworzymy klasy domenowe Grails, które mają pewne zachowania związane z nimi, i pewne egzekwowanie semantyki relacji. W tym konkretnym przykładzie biznesowym prawdopodobnie nie chcesz udostępniać tego samego rekordu adresu wielu osobom, chcesz tylko przechowywać adres oddzielnie (może przygotować się na dzień, w którym dana osoba ma wiele adresów). pewnie bym głosował za takim podejściem:
class Person {
Address address
static constraints = {
address unique:true
}
}
address_id
klucz obcy będzie w tabeli osoby, a UNIQUE wymusi że żadne dwie osoby są zapisy wskazujące na ten sam adres.
To ma sens, dzięki. Przepraszam za to trochę brzęczenia mózgu. Zaplątałem się w mechanizmy grails i nie cofnąłem się, by myśleć o tym z perspektywy bazy danych. –