Thực sự chỉ có hai cách tôi có thể nghĩ đến để giải quyết vấn đề này, cả hai đều đã đề cập đến. Cá nhân, tôi sẽ đi với cách tiếp cận đầu tiên (tạo một đối tượng ánh xạ như một thực thể OO). Điều này ngăn cản bạn giữ thông tin dư thừa xung quanh và phải đồng bộ hóa; nó cũng có nghĩa là nếu hiệp hội kết thúc có các lĩnh vực riêng của mình (ngày mà cuốn sách được gán cho thể loại đó, giả sử), chúng có thể được kết hợp một cách dễ dàng. Chúng tôi sử dụng phương pháp này cho một loạt các hiệp hội trong hệ thống của chúng tôi.
Đối tượng OO sẽ trông như thế:
BookCategory {
Book book
Category category
}
Book {
Collection <BookCategory> categories
}
Category {
Collection <BookCategory> categories
}
Ở đây bạn có để giữ các đối tượng liên quan và hai bộ sưu tập đồng bộ; tuy nhiên, các bộ sưu tập là tùy chọn trong trường hợp này. Thông thường bạn có thể nhận được các thông tin tương tự với một truy vấn ORM, một cái gì đó như: chọn b.book từ BookCategory b nơi b.category = MyCategory
Cách khác là để có một thiết lập như:
Book {
Collection<Category> categories
}
Category {
Collection<Books> books
}
Nếu công cụ ORM/DB của bạn tự động duy trì các liên kết, điều này là tốt; nếu không, bạn đang bị mắc kẹt khi cập nhật cả hai bộ sưu tập. (Trong Hibernate, một bên sẽ có thuộc tính: inverse = true trên ánh xạ; mặt này không được cập nhật, do đó, nói đúng là nó không cần phải được duy trì. Điều này có vẻ như tôi thực hành không tốt.)
Nếu bạn thường chỉ truy cập vào mối quan hệ một cách (ví dụ, nhận tất cả các sách trong một danh mục), bạn có thể loại bỏ bộ sưu tập ở phía bên kia; sau đó tôi nghĩ bạn sẽ phải làm việc xung quanh công cụ ORM và sử dụng truy vấn gốc để truy cập mối quan hệ từ hướng khác.
Chúng tôi sử dụng Hibernate (một công cụ lập bản đồ quan hệ đối tượng dựa trên java) trên dự án của chúng tôi; tài liệu Hibernate là một tài liệu tham khảo tốt cho các vấn đề thiết kế quan hệ/OO, mặc dù bạn có thể phải dành một chút thời gian học Hibernate để làm cho chúng hữu ích: http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#collections-ofvalues
HTH!
Tôi muốn xem liệu tôi có thể tránh việc tạo ra một dbschema, tạo bảng, tạo đối tượng, ánh xạ bảng cho đối tượng, v.v. v.v. Có vẻ như một odbms có thể cắt ra rất nhiều công việc lừa ... – paul
Nó có thể cắt ra một số công việc đó, nhưng như vậy sẽ là một lớp ORM phong nha. Tôi không nói rằng ODBMS là sự lựa chọn sai, nhưng có những lựa chọn thay thế có thể phục vụ bạn tốt hay tốt hơn. –