2011-07-05 43 views
12

Tài liệu của Apple về Relationship Delete Rules rất đơn giản và rõ ràng. Nhưng nó chỉ nói về mối quan hệ One-to-Many (Xóa quy tắc cho mối quan hệ một-một-một dễ suy ra). Không rõ những quy tắc này có ý nghĩa gì đối với mối quan hệ Nhiều người một với một. Vì vậy, hãy làm rõ chúng ở đây.Xóa quy tắc cho mối quan hệ nhiều-một-một

Chúng tôi sử dụng ví dụ Employees-Department được sử dụng trong tài liệu của Apple. Mặc dù các hàm ý thực tế có thể là vô lý đối với các quy tắc này áp dụng cho mối quan hệ của nhân viên - Sở , chúng tôi, là lập trình viên, chỉ nói về ý nghĩa logic của chúng ở đây.

  • Deny
    Nếu có một đối tượng tại điểm đến mối quan hệ, sau đó các đối tượng nguồn không thể bị xóa. Ví dụ, nếu bạn muốn xóa một nhân viên, bất kể có nhân viên nào khác trong bộ phận của mình hay không, bạn phải đảm bảo rằng phòng ban đầu tiên bị xóa nếu không nhân viên không thể bị xóa.

  • vô hiệu hóa
    Tháo đối tượng nguồn từ mối quan hệ nghịch đảo của các đối tượng tại điểm đến. (Xem giải thích ngắn gọn của @ bshirley)

    Ví dụ: nếu bạn xóa một nhân viên, hãy xóa anh ta khỏi mối quan hệ nhân viên của bộ phận của anh ấy. Điều này chỉ có ý nghĩa nếu số lượng nhân viên còn lại của bộ phận lớn hơn số lượng tối thiểu bắt buộc hoặc nếu bạn đảm bảo rằng bạn thêm nhân viên mới cho bộ phận trước hoạt động lưu tiếp theo.

    [Câu hỏi: Nếu đó là người lao động cuối cùng, sẽ nhân viên của bộ phận quan hệ trở thành tập rỗng hoặc null?]
    (Giải đáp của @TechZen:. A đến-nhiều mối quan hệ luôn luôn trả về một đối tượng bộ Không bao giờ nil. Nếu không có đối tượng ở phía bên kia của mối quan hệ, tập rỗng.)

  • Cascade Xóa đối tượng tại điểm đến của mối quan hệ.

    Ví dụ: nếu bạn xóa nhân viên, hãy xóa bộ phận của mình cùng một lúc, ngay cả khi vẫn còn các nhân viên khác trong bộ phận.

    (Cách sử dụng Caveat: Nó thường gây ra "là chuỗi xích xóa toàn bộ đồ thị đối tượng", như mô tả của @TechZen trong ví dụ của mình.)

  • No Action
    Không làm gì cả cho đối tượng ở đích của mối quan hệ.

    Ví dụ: nếu bạn xóa một nhân viên, hãy rời khỏi phòng của anh ấy, ngay cả khi nó vẫn tin rằng nó sở hữu nhân viên đó.

Ý nghĩa của quy Xóa cho Nhiều-to-Nhiều mối quan hệ có thể được suy ra từ đây.

+0

lý do tại sao ví dụ này suy nghĩ và phối cảnh nhân viên .... nếu bạn xóa một nhân viên, xóa bộ phận của mình cùng một lúc, ngay cả khi vẫn còn nhân viên khác trong bộ phận .. sẽ được đảo ngược ..... nếu bạn xóa một bộ phận, hãy xóa tất cả nhân viên cùng một lúc, ngay cả khi vẫn còn nhân viên trong bộ phận –

Trả lời

8

Đây là các quy tắc xóa cho tất cả các mối quan hệ (không phải thuộc tính). Chúng được áp dụng cho các mối quan hệ cho một hoặc đến nhiều người.

  • vô hiệu hóa - nếu bạn xóa một nhân viên, mối quan hệ ngược được thiết lập để nil, nếu nó là 1-to-1 sau đó theo nghĩa đen, trong nhân viên này bộ phận trường hợp được rút ngắn từ một

  • Cascade - nếu bạn xóa một nhân viên, bộ phận của nó sẽ bị xóa. Bộ sẽ thực hiện theo quy tắc xóa trên tất cả các thuộc tính của nó, 1) nếu nhân viên xóa quy tắc là Cascade, tất cả nhân viên sẽ bị xóa bởi hành động này; 2) nếu nhân viên xóa quy tắc là Nullify, tất cả nhân viên sẽ bị "kẹt" không có bộ phận

+0

Bạn có thể làm rõ quy tắc Nullify với nhiều chi tiết hơn không? "bộ phận của nó được đặt thành nil" dường như không có ý nghĩa ở đây. Và để giữ cho mọi thứ đơn giản và rõ ràng, vui lòng không mở rộng đến việc áp dụng ngược lại quy tắc xóa của Cục đối với mối quan hệ nhân viên đã được nêu rõ trong tài liệu của Apple. Cảm ơn. – an0

+0

@an thác chính xác có nghĩa là bạn cần phải lo lắng về quy tắc xóa thuộc tính bị truy đuổi là gì. "bộ phận được thiết lập để không" _is_ không nhạy cảm, bạn đang phải, chỉnh sửa đến – bshirley

1

Bạn dường như giả định rằng có một số thay đổi trong hành vi xóa quy tắc giữa một người và nhiều người nhưng không có. Mọi thứ hoạt động chính xác theo cùng một cách. Nếu bạn nghĩ về nó, nó phải là như vậy bởi vì một-nhiều chỉ là mối quan hệ đối ứng của một nhiều-một.

Tôi nghĩ rằng đó là ý tưởng về một mối quan hệ đối ứng đang vấp ngã bạn ở đây. Mỗi bên của mối quan hệ được xác định riêng và có quy tắc xóa riêng có thể khác với quy tắc xóa ở phía bên kia.

Hãy lấy Bộ tiêu chuẩn chung và Nhân viên làm ví dụ.

Department{ 
    name:string 
    employees<--(required,cascade)-->>Employee.department 
} 

Employee{ 
    name:string 
    department<<--(required, nullify)-->Department.employee 
    projects<--(optional,cascade)-->>Project.owner 
} 

Project{ 
    name: 
    owner<<--(required,nullify)-->Employee.projects 
} 

Lưu ý rằng tất cả các mối quan hệ, mỗi dòng mũi tên trong mô hình đồ họa, có hai giới thiệu gắn liền với nó trong mối quan hệ đối ứng (trong đó là hình thức tiêu chuẩn.) Mỗi ​​mô tả mô tả mối quan hệ từ "quan điểm" của một của các thực thể liên quan. Vì vậy, mỗi mối quan hệ một-nhiều chỉ là sự lộn xộn của một mối quan hệ nhiều-một.

Ngoài ra, không phải tùy chọn/yêu cầu/số lượng nhỏ của một mối quan hệ nhiều bên có thể chặn xóa các đối tượng ở phía bên kia.

Lấy Cục < - >> Mối quan hệ nhân viên. Từ quan điểm của Sở, một đối tượng của Bộ phải có ít nhất một nhân viên. Nếu nó chỉ có một nhân viên, thì nhân viên đó không thể bị xóa. Nếu chính đối tượng của Cục bị xóa thì tất cả nhân viên của nó cũng sẽ bị xóa. Từ quan điểm của nhân viên, mỗi nhân viên phải có một bộ phận duy nhất. Bất kỳ nỗ lực nào để lưu giá trị nil cho giá trị của bộ phận đối tượng của nhân viên sẽ ném một lỗi xác thực. Tuy nhiên, nếu đối tượng nhân viên bị xóa, thì không có gì xảy ra với đối tượng Department ngoại trừ việc nó mất một trong các đối tượng nhân viên của nó. Tuy nhiên, nếu đối tượng nhân viên là đối tượng nhân viên duy nhất trong mối quan hệ, đối tượng Sở sẽ chặn việc xóa.

Xóa tầng, như tên của nó, có thể đặt ra một chuỗi chuỗi xóa trên toàn bộ biểu đồ đối tượng. Khi bạn xóa một đối tượng Department, nó xóa tất cả các đối tượng Employee có liên quan, mỗi đối tượng này sẽ xóa tất cả các đối tượng Project của họ.

Nhưng nếu bạn có một thác xóa quy tắc thiết lập trên cả hai mặt của một mối quan hệ nhiều-nhiều như thế này:

Alpha{ 
    betas<<--(cascade)-->>Beta.alphas 
} 

Beta{ 
    alphas<<--(cascade)-->>Alpha.betas 
} 

Trong trường hợp đó, xóa bất kỳ một đối tượng trong đồ thị sẽ xóa tất cả khác các đối tượng liên quan bằng một trong hai phím. Xóa một đối tượng Beta sẽ xóa tất cả các đối tượng Alpha sẽ xóa tất cả các đối tượng Beta của chúng, điều này sẽ xóa tất cả các đối tượng Alpha của chúng ... và cứ như vậy cho đến khi tất cả các đối tượng liên quan có thể truy cập bị xóa.

Rõ ràng là một hai mặt để nhiều, mối quan hệ tầng là một cách tốt để bắn mình vào chân.

Trong tổng:

  • Các mối quan hệ được xác định trên cả hai mặt của các mối quan hệ của từng đối tượng một cách độc lập.
  • Xóa quy tắc có thể bị ghi đè theo tùy chọn hoặc số tiền nhỏ.
  • Hiểu hành vi thời gian chạy của một mối quan hệ yêu cầu kết hợp các tác động của các quy tắc xóa, tùy chọn và số tiền nhỏ.

Một lý do để tạo trình chỉnh sửa mô hình dữ liệu là áp đặt một số logic hạn chế về các quy tắc quan hệ để giữ/cảnh báo lập trình viên tạo ra các quy tắc không mong muốn và mục đích chéo.

+0

Một "yêu cầu" để nhiều mối quan hệ mà không có một minCount rõ ràng ngụ ý một minCount của 1? Một điểm khó hiểu của mối quan hệ nhiều-nhiều là khác nhau giữa nil và tập rỗng, bạn có thể sống trên đó không? – an0

+1

Một yêu cầu nhiều người tự động nhận được một số tiền là 1 nhưng nó có thể lớn hơn. Mối quan hệ nhiều-nhiều luôn trả về một đối tượng đã đặt. Nó không bao giờ là không. Nếu không có đối tượng ở phía bên kia của mối quan hệ, tập hợp sẽ trống. – TechZen

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