Blog‎ > ‎

Ức chế khi thiết kế Data Model

posted Feb 22, 2012, 5:52 AM by Nguyễn Văn Cao Nguyên   [ updated Feb 22, 2012, 5:53 AM ]
Mấy bửa nay gặp 1 lỗi như thế này:
{"Introducing FOREIGN KEY constraint 'GroupWall_Writer' on table 'GroupWall' may cause
cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION,
or modify other FOREIGN KEY constraints.Could not create constraint.
See previous errors."
}
Tìm một hồi lâu trên Trên Google và website ưa thích (http://stackoverflow.com) thì
người ta đưa ra một nguyên nhân gọi là cascade delete 
Nguyên nhân sâu xa thì tìm đc vài cái:
 when a cascade path goes from column col1 in table A to table B and also from column col2 in table A to table B
Ví dụ:
public class Address
{
    public int AddressId { getset; }
    public string Street { getset; }
    public string City { getset; }
    public string PostalCode { getset; }   
}
public class User
{
    public int UserId { getset; }
    public string FirstName { getset; }
    public string LastName { getset; }        
    public int BillingAddressId { getset; }
    public int DeliveryAddressId { getset; }       
    
    [ForeignKey("BillingAddressId")]
    public Address BillingAddress { getset; }
    
    [ForeignKey("DeliveryAddressId")]
    public Address DeliveryAddress { getset; }
}
Một user có thể có 2 thuộc tính trỏ tới 1 bảng, vấn đề là khi trỏ tới, 1 User đáng lẻ phải trỏ tới 2 dòng bên bản Address nhưng cũng chỉ có thể trỏ tới 1 dòng (*), khi xóa User cascade delete sẽ xóa luôn Address, với trường hợp (*) sẽ gây trục trặc.
Trường hợp nữa là vầy: Ta có User, Group, Comment. 1 User sở hửu nhiều Comment, 1 User sở hửu nhiều Group, 1 Group sở hửu nhiều Comment. Khi Xóa , bởi tính năng cascade (dịch ra là thác, suối, hiểu nôm na là delete dây chuyền) Ta có: Xóa User->Group, User->Comment. Xóa Group->Comment. Như vậy khi xáo User nó xóa luôn Group (A), xóa luôn Comment. Nhưng khi thực hiện (A) xáo Group xáo luôn Comment. Như vậy giai đạon xóa Comment sẽ gây ra lỗi..
Giải pháp là tắt chức năng xoáy chuyền đi..., đúng là càng hiện đại thì càng hại điện.
Comments