2011-11-23 26 views
5

tôi đọc this page nhưng đã không nhận được khi sử dụng tính năng nhúng và khi nào sử dụng linking.I có một dự án trong django mà tôi đang sử dụng tập tin MongoDB.In models.py của tôi, tôi có các mô hình sau:Nhúng Vs Liên kết trong MongoDB.khi nhúng và thời điểm liên kết?

class Projects(models.Model): 
    projectName =models.CharField(max_length = 100,unique=True,db_index=True) 
    projectManager = EmbeddedModelField('Users') 

class Teams(models.Model): 
    teamType = models.CharField(max_length =100) 
    teamLeader = EmbeddedModelField('Users') 
    teamProject = EmbeddedModelField('Projects') 
    objects = MongoDBManager() 

class Users(models.Model): 
    name = models.CharField(max_length = 100,unique=True) 
    designation = models.CharField(max_length =100) 
    teams = ListField(EmbeddedModelField('Teams')) 



class Tasks(models.Model): 
    title = models.CharField(max_length = 150) 
    description = models.CharField(max_length=1000) 
    priority = models.CharField(max_length=20) 
    Status = models.CharField(max_length=20) 
    assigned_to = EmbeddedModelField('Users') 
    assigned_by = EmbeddedModelField('Users') 
    child_tasks = ListField() 
    parent_task = models.CharField(max_length = 150) 

Câu hỏi của tôi là nếu chúng ta nhúng chúng ta phải cập nhật đối tượng trong tất cả các mô hình. Giống như nếu tôi muốn cập nhật tên của 'người dùng', tôi sẽ phải chạy bản cập nhật cho các mô hình: Dự án, Nhóm, Người dùng và Công việc hoặc liên kết sẽ tốt hơn trong trường hợp của tôi?

Trả lời

3

Đầu tiên, khái niệm, đặt tên cho các lớp mô hình của bạn là các đối tượng số ít.

Người dùng phải là Người dùng, Nhóm phải là Nhóm ...

Hãy nghĩ mô hình là khuôn mà từ đó nhiều đối tượng sẽ được tạo. Mô hình người dùng sẽ sản phẩm Người dùng và được lưu trữ trong một bảng được gọi là Người dùng trong đó mỗi tài liệu/hàng là đối tượng Người dùng.

Bây giờ, về câu hỏi của bạn, hymloth là chính xác. Cách để làm cho nó tham chiếu đến một tài liệu thay vì một tài liệu được nhúng là thay đổi các trường cụ thể đó để tham chiếu id của người dùng trong bộ sưu tập của người dùng. Bằng cách đó bạn chỉ cần lưu trữ một id để tra cứu thay vì một bản sao của tài liệu người dùng. Khi bạn thay đổi tài liệu tham chiếu, nó sẽ được thay đổi ở tất cả các nơi mà nó được tham chiếu. (Hiệp hội quan hệ tiêu biểu)

Tôi không thấy một trường cho điều đó trong Django-mongoDB, nhưng có lẽ bạn có thể sử dụng trường django ForeignKey truyền thống cho mục đích này. Tôi không biết nếu bạn có thể trộn và kết hợp để cho nó một shot.

ví dụ, lớp Nhóm của bạn sẽ có một trường như thế này:

teamLeader = ForeignKey(User) 

Hãy cho tôi biết nếu mà làm việc.

4

Trong ví dụ của bạn, có, thay đổi tên của người dùng ngụ ý rằng nếu bạn sử dụng nhúng thì bạn phải cập nhật tất cả các tài liệu khác với một bước bổ sung. Điều gì là thích hợp hơn trong tình huống của bạn là liên kết (tham chiếu). Điều này liên quan đến một bước bổ sung tại thời điểm truy vấn, nhưng vì "logic nghiệp vụ" cụ thể của bạn, nó là tốt hơn.

Nói chung, nếu một tài liệu nhất định cần phải được truy cập từ một số địa điểm khác nhau thì có nghĩa là làm cho nó trở thành tham chiếu thay vì được nhúng. Điều tương tự cũng áp dụng trong các tình huống khi tài liệu thay đổi thường xuyên.

+0

bạn có thể chỉ cho tôi một ví dụ không? tôi sẽ biết ơn bạn :) – Anshul

+0

Chỉ cần thay thế tất cả các EmbeddedModelField của bạn ('Người dùng') với một ReferenceField ('Người dùng'). – hymloth

+0

Nhưng tôi đang sử dụng công cụ Django-mongoDB và nó không có trường như ReferenceField. :( – Anshul

Các vấn đề liên quan