Foreign key?

Hôm nay trong lúc đang làm việc tại cơ quan, mình phát hiện rằng toàn bộ các foreign key (FK) trong database đột nhiên biến mất. Vô cùng ngạc nhiên, đi hỏi xem thử thì biết được rằng cấp trên và team database đã quyết định bỏ toàn bộ FK vì một số nguyên nhân … [lí do, lí do và lí do]. Rõ ràng rất vô lí, trái ngược với những gì mình được học, biết và làm.

Kết hợp những gì trong công ty và search google, tổng hợp lại lí do tại sao không dùng FK (và cả trigger) trong database:

Do có FK nên việc add hay delete phải đúng thứ tự, bằng không sẽ không thực hiện được. Dẫn đến khó khăn trong lúc lập trình vì lập trình viên cần insert dữ liệu để test nhanh hoặc delete dữ liệu sau khi test.

Các quan hệ chỉ cần tồn tại ở mức application là đủ, không cần tồn tại trong database

Dữ liệu được check kĩ trong ứng dụng rồi, xuống database sẽ chắc chắn đảm bảo tính đúng đắn

Performance

Nghe cũng có lí, nhưng có vẻ vẫn có gì đó không ổn. Xem xem nếu có foreign key thì sao? Nếu có foreign key:

Sẽ không tồn tại Orphaned Rows, dữ liệu luôn được kiểm tra về mối quan hệ trong vào database

Dễ dàng trong việc hình dung mối quan hệ trong database

 

Vậy với những thứ được và mất như trên, ta có nên sử dụng Foreign key?

Vẫn chưa quyết định được, hãy thử suy nghĩ tiếp:

Ứng dụng bạn đang phát triển là ứng dụng cá nhân (tự code tự xài), open source hay một ứng dụng thương mại? Nếu câu trả lời là thuộc 2 ý đầu thì bạn hoàn toàn có quyền bỏ luôn FK vì nó là của bạn, thích nó ra sao hoàn toàn do bạn. Nhưng nếu là một ứng dụng thương mại, hãy cẩn thận. Ai biết được người ta sẽ làm gì với sản phẩm của bạn. Biết đâu họ không biết mà bỏ qua bước kiểm tra hoàn hảo ở mức ứng dụng của bạn mà viết thẳng vào database. Có chúa mới biết chuyện gì xảy ra.

Dữ liệu trong database có quan trọng không? Nếu bạn đang làm một ứng dụng thương mại và câu trả lời vẫn là không thì tại sao phải tạo ra database làm gì?

ORM? ORM sẽ làm được gì nếu database của bạn không có FK? Bạn đang nghĩ sẽ có tool hay convention tạo ra những quan hệ kiểu User.Roles mà không cần FK? Vâng, .NET (một ví dụ vì mình là dân .NET) có tool làm được đấy (manually) nhưng nghĩ xem phải bỏ ra bao nhiêu effort để làm được ra không?

Performance? Thật tế thì mình không rõ sẽ chậm đi nhiều ít ra sao nhưng khách hàng sẽ chấp nhận một ứng dụng chạy chậm 1 tí và đảm bảo tính đúng đắn (tới mức có thể) và một ứng dụng chạy nhanh nhưng hên xui.

Có một mẫu chuyện rất vui xung quanh chuyện tranh cãi này như sau:

Most everyone was taught when they were kids that brushing your teeth was important. Can you get by without it? Sure, but somewhere down the line you’ll have less teeth available than you could have if you had brushed after every meal. If moms and dads were responsible enough to cover database design as well as oral hygiene, we wouldn’t be having this conversation.🙂 (Trích)

Nếu bạn thực sự quan tâm đến độ an toàn, chính xác của dữ liệu và tương lai ứng dụng của bạn thì hãy sử dụng Foreign Key.

Tham khảo:

http://stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys

http://www.oreillynet.com/onlamp/blog/2006/05/misunderstanding_foreign_keys.html

Posted in Uncategorized
In Archive