Tôi thấy việc sử dụng hasOne
trong Grails đặc biệt khó hiểu. Ví dụ, câu hỏi này hỏi những gì sẽ xảy ra khi một mối quan hệ Toone được khai báo như sau:
class Person {
static hasOne = [address: Address]
}
Như đã trình bày ở trên, điều này gây ra chìa khóa nước ngoài person_id
xuất hiện trong bảng địa chỉ, có nghĩa là mỗi Địa chỉ chỉ có thể điểm mà tại một người. Những gì tôi thấy kỳ lạ, sau đó, là mặc dù mã được viết là "một người có một địa chỉ", kết quả thực tế là "một địa chỉ có một người". Trên thực tế, chỉ được định nghĩa ở trên, không có gì (ở cấp cơ sở dữ liệu) ngăn nhiều hơn một bản ghi Địa chỉ trỏ đến cùng một Người, có nghĩa là một Người không thực sự phải có một Địa chỉ sau tất cả .
Điều thú vị là bạn sẽ có được đại diện cơ sở dữ liệu tương tự nếu bạn tạo lớp Địa chỉ như thế này:
class Address {
Person person
}
Chìa khóa ngoại person_id
sẽ nằm trong bảng địa chỉ, giống như như trong ví dụ trước, nhưng rõ ràng, bạn không thể nhận được từ Người đến Địa chỉ trong mã mà không xác định mối quan hệ đó theo một cách nào đó.
Cũng thú vị là, nếu bạn đã mô hình hoá mối quan hệ toMany từ Người sang Địa chỉ trong cơ sở dữ liệu, bạn sẽ sử dụng cùng một bố cục bảng. Bạn sẽ đặt khóa chính của cha mẹ (person_id) vào bảng con. Từ phối cảnh cơ sở dữ liệu, sử dụng hasOne
sẽ tạo cấu trúc tương tự mà mối quan hệ toMany sẽ tạo ra. Tất nhiên, chúng tôi không chỉ tạo ra các bảng cơ sở dữ liệu, chúng tôi đang tạo ra các lớp miền Grails có một số hành vi liên kết với chúng, và một số thực thi ngữ nghĩa mối quan hệ. Trong ví dụ kinh doanh cụ thể này, có thể bạn không muốn chia sẻ cùng một bản ghi Địa chỉ với nhiều Người, bạn chỉ muốn lưu trữ Địa chỉ riêng biệt (có thể chuẩn bị cho ngày khi một Người có nhiều Địa chỉ). Tôi có lẽ muốn bỏ phiếu cho phương pháp này:
class Person {
Address address
static constraints = {
address unique:true
}
}
Chìa khóa ngoại address_id
sẽ nằm trong bảng Person, và hạn chế duy nhất sẽ thi hành mà không có hai hồ sơ Người đang trỏ tại cùng một địa chỉ.
Điều đó có ý nghĩa, cảm ơn. Xin lỗi một chút của một fart não từ tôi ở đây. Tôi đã bị cuốn vào cơ chế grails và không lùi bước suy nghĩ về nó từ góc độ cơ sở dữ liệu. –