NoQuery trong SQL Server


28

Câu hỏi này không phải là về sự khác biệt giữa SQL và NoQuery. Tôi đang tìm kiếm một số lý do cho một cái gì đó thực sự không có ý nghĩa với tôi tại thời điểm này (có thể vì sự thiếu hiểu biết hoặc đánh giá cao của tôi).

Chúng tôi đã bắt đầu một dự án mới từ đầu bằng cách sử dụng MVC5, mã Entity framework 6 và SQL Server 2008. Khi kiến ​​trúc sư xem xét lược đồ cơ sở dữ liệu, cần phải loại bỏ tất cả các khóa ngoại và các ràng buộc khác như vậy vì đây là logic kinh doanh. nên được áp dụng trong lớp nghiệp vụ của mã ứng dụng.

Ý kiến ​​của tôi là các khóa ngoại tạo thành một phần của tính toàn vẹn dữ liệu / tham chiếu và không thực sự bắt chước logic kinh doanh. Tôi thấy logic kinh doanh khi nhiều quá trình và xác nhận kiểm soát những gì / khi / làm thế nào / tại sao các tham chiếu được áp dụng. Tôi có thể hiểu rằng các ràng buộc duy nhất là các quy trình kinh doanh có thể tranh cãi, nhưng đối với tôi điều này chỉ bổ sung cho logic và tạo thành một phần của tính toàn vẹn.

Đối số thứ hai là mục đích là áp dụng cách tiếp cận dữ liệu của NoQuery. Tôi thấy điều này thực sự bất thường và không chính thống: xem xét việc sử dụng SQL-Server 2008, nhu cầu báo cáo, dữ liệu không mở rộng đến terabyte và thiếu cân nhắc đối với các công nghệ như Mongo, Raven, v.v.

Có ai đã gặp một kịch bản như vậy trước đây? Tại sao mọi người sẽ áp dụng cách tiếp cận NoQuery trong Máy chủ SQL được thiết kế cho dữ liệu tham chiếu và không muốn khóa ngoại?


21
Nói chuyện với kiến ​​trúc sư hệ thống của bạn về lý do của lời khuyên của mình. Hoặc anh ta có một lý do rất chính đáng áp dụng cho trường hợp cụ thể của bạn (một lý do mà chúng tôi không nhất thiết có thể đoán được, mà không biết chính xác ứng dụng của bạn bao gồm những gì), hoặc anh ta không đủ năng lực.
Arseni Mourzenko 30/03/2015

23
Tôi đã thấy nhiều cơ sở dữ liệu được triển khai theo cách tương tự: không có FK, không ràng buộc CHECK mỗi khi đó là các cơ sở dữ liệu được thiết kế bởi các lập trình viên thiếu kinh nghiệm, không biết gì về kiến ​​trúc cơ sở dữ liệu, tính toàn vẹn tham chiếu, v.v. Nhưng điều quan trọng là bạn phải thảo luận về nó đồng nghiệp của bạn, thay vì chỉ đơn giản cho rằng anh ta bất tài.
Arseni Mourzenko 30/03/2015

5
Tôi hơi bối rối; bạn đề cập đến việc sử dụng khung Entity (mã trước) ... không có nghĩa là bạn tạo Đối tượng (theo nghĩa C #) và sau đó để khung Entity xử lý việc xây dựng cơ sở dữ liệu tương đương, trong trường hợp đó cố gắng thêm / xóa FK, v.v. một bài tập trong việc cố gắng vượt qua Entity Framework (giống như câu nói của Mark Twain về việc cố gắng dạy một con lợn hát?)
Foon

2
Có quá nhiều người tự nhận mình là "kiến trúc sư", nhưng thực sự không có kinh nghiệm về mã hóa hoặc duy trì các hệ thống lớn hơn.
Doc Brown

2
Có liên quan: thed Dailywtf.com/articles/The-Mythical-Business-Layer . "Nếu bạn nghĩ về nó, hầu như mọi dòng mã trong một ứng dụng phần mềm là logic kinh doanh." Điều này mở rộng đến cơ sở dữ liệu. "Nhưng nó cũng quan trọng - nếu không phải như vậy - hãy nhớ rằng hầu hết tất cả mã của ứng dụng sẽ là logic kinh doanh. Đã có đủ công cụ ngoài đó; ứng dụng của bạn không cần lớp chung " (nhấn mạnh của tôi). Người đề xuất điều này có lẽ đang cố gắng biến cơ sở dữ liệu thành một lớp chung như vậy. Nói tóm lại, rất có thể họ đang đặt buzzwords lên trên thực tế.
jpmc26

Câu trả lời:


74

Khi ông xem xét lược đồ cơ sở dữ liệu, ông nói rằng tất cả các khóa ngoại và các ràng buộc khác phải được loại bỏ vì đây là logic nghiệp vụ và nên được áp dụng trong lớp nghiệp vụ.

Sau đó, anh ta là một thằng ngốc và một số trích đoạn từ cơ sở mã của bạn có thể sẽ kết thúc trên Daily WTF một ngày nào đó. Bạn hoàn toàn đúng khi cho rằng cách tiếp cận của anh ấy không có ý nghĩa, và thẳng thắn cũng không giải thích.

Hãy thử giải thích với anh ta rằng các ràng buộc toàn vẹn tham chiếu không phải là "logic kinh doanh"; chúng là một tiêu chuẩn chính xác với xác minh tích hợp sẵn. Logic kinh doanh là về những gì bạn làm với dữ liệu; tính toàn vẹn là về việc đảm bảo rằng dữ liệu không bị hỏng. Và nếu điều đó không hiệu quả ... tốt, anh ấy sẽ chịu trách nhiệm. Bạn có thể đi cùng với kế hoạch của anh ta và cố gắng giảm thiểu thiệt hại phần nào, hoặc bắt đầu tìm kiếm một nơi tốt hơn để làm việc. (Hoặc cả hai.)


17
Tôi đã có một câu trả lời ngoại giao hơn một chút cố gắng tìm một lý do (lành mạnh) tại sao kiến ​​trúc sư có thể làm điều này. Thay vào đó, tôi sẽ lên tàu với câu trả lời này.
Blrfl

7
Whoa whoa, cố gắng kiến ​​trúc xấu là một lý do để đi làm việc ở một nơi khác? Chết tiệt, tôi sẽ không bao giờ có thể tiếp tục làm việc ở bất cứ đâu nếu tôi có triển vọng đó.
Kzqai

5
@Kzqai cũng có kiến ​​trúc sư hiểu sai về cơ bản kiến ​​trúc. Điều này bắt đầu nghe giống như chỉ thị 595 và vâng, nếu ai đó muốn buộc tôi sử dụng búa để vặn ốc vít vào một miếng gỗ, tôi sẽ tìm ai đó không ép buộc tôi sử dụng sai công cụ để chế tạo thứ gì đó.

4
Tính toàn vẹn tham chiếu là một chủ đề cốt lõi trong lý thuyết cơ sở dữ liệu, chưa kể tất cả các cơ sở dữ liệu hỗ trợ nó trong thế giới thực. Rõ ràng đồng nghiệp của Andy là đúng trong phân tích của mình, phần còn lại của thế giới học thuật và chuyên nghiệp là sai 100%. Điểm thưởng khi đề cập đến WTF hàng ngày .

2
@AndyClark Bạn nên bỏ qua việc này. Lý do là nó là một quả bom hẹn giờ hạt nhân trong lõi của công ty bạn. Nó chỉ là vấn đề thời gian khi vấn đề phân đặt trên máy thở. Khi điều đó xảy ra, bạn sẽ may mắn làm việc theo ca 72 giờ, trường hợp xấu nhất bạn đang tìm việc ... tốt hơn là tìm việc khi bạn có thu nhập.
ArTs

2

Tôi vẫn chưa có lý do để tạo khóa ngoại

- Joel Spolsky

Bỏ các tuyên bố sang một bên, đáng để thừa nhận có những lý do chính đáng và mạnh mẽ để chọn không sử dụng tính duy nhất hoặc các ràng buộc khóa ngoại. Hầu hết đi một cái gì đó như thế này:

  • Hiệu suất. Thực hiện kiểm tra tính toàn vẹn với các giao dịch nguyên tử không phải là miễn phí. Và thường xuyên, cơ sở dữ liệu là phần khó nhất trong kiến ​​trúc của bạn để mở rộng quy mô. Có lẽ bạn đã thực hiện các kiểm tra trong logic ứng dụng của mình và không muốn thực hiện cú đánh hiệu suất thứ hai.
  • Thiếu nhu cầu. Có lẽ dữ liệu của bạn là bẩn, và bạn ổn với điều đó. Điều này phụ thuộc rất nhiều vào những gì bạn đang làm.

Xem thêm Có gì sai với khóa ngoại?


Nhưng những điều đó không phù hợp với lý do trong câu hỏi của bạn.

Đây là logic kinh doanh và nên được áp dụng trong lớp kinh doanh.

Lý do này hơi kỳ quặc. Tính duy nhất và các ràng buộc toàn vẹn khác là rất nhiều miền của cơ sở dữ liệu ACID. Mã ứng dụng của bạn không thể tiếp cận các đảm bảo tính nguyên vẹn và toàn vẹn của SQLServer. Nếu bạn cần toàn vẹn dữ liệu, bạn sẽ thật ngu ngốc khi bỏ qua cơ sở dữ liệu.

Một lập luận thứ hai là họ muốn áp dụng cách tiếp cận NoQuery vào việc lưu trữ dữ liệu của họ và do đó không muốn có những hạn chế như vậy.

Lý do thứ hai không thực sự là một lý do; đó là một kết luận. Mặc dù sự thật là các ràng buộc là sự đánh đổi giữa tính chính xác và hiệu năng và cơ sở dữ liệu NoQuery thiên về hướng sau.


Có lẽ kiến ​​trúc sư hệ thống của bạn có những lý do chính đáng này trong đầu, và bạn nghe nhầm. Hoặc có thể anh ta là một thằng ngốc.

Trong mọi trường hợp, có những lý do hợp lệ (mặc dù không phổ biến) để hạn chế sử dụng tính duy nhất và các ràng buộc khóa ngoài.

PS Nếu bạn kết luận rằng bạn không muốn có khóa ngoại, bạn vẫn có thể sử dụng cơ sở dữ liệu quan hệ. Là một khái quát, các cơ sở dữ liệu quan hệ đã trưởng thành hơn so với các đối tác NoQuery của họ. Là một nút duy nhất, chúng thậm chí có thể nhanh hơn và một bản tóm tắt NoQuery có thể được xây dựng trên đầu chúng .


12
Tôi dám nói Joel không phải là một thằng ngốc, nhưng một câu trả lời dí dỏm trong một podcast, mà không có bất kỳ lời giải thích nào, IMHO, thậm chí còn ít hơn một tuyên bố từ bất kỳ kẻ ngốc nào.
Martin Ba

11
Joel là một anh chàng bảng tính, không phải là một anh chàng cơ sở dữ liệu, vì vậy anh ta không biết gì về các thực hành cơ sở dữ liệu quan hệ tiêu chuẩn, tôi đoán, không đáng ngạc nhiên ... Không xúc phạm, Joel. :-)
Eric King

3
Báo giá thực tế trong bối cảnh của Joel là các công nghệ, chẳng hạn như LINQ, cung cấp lý do để bận tâm thiết lập khóa ngoại. Joel không phải là quản trị viên cơ sở dữ liệu và, từ việc tìm kiếm blog của anh ấy và là một người đọc lâu năm, tôi không thể tìm thấy bất cứ điều gì từ anh ấy nói về chủ đề này hoặc cố gắng đưa ra lời khuyên về tối ưu hóa cơ sở dữ liệu, thiết kế mô hình dữ liệu, v.v. , nhưng anh ấy không phải bây giờ và cũng chưa bao giờ - hoặc được cho là như vậy! - một chuyên gia trong lĩnh vực cơ sở dữ liệu hoặc mô hình dữ liệu. Nó giống như trích dẫn Einstein về lãi kép - hoặc, đối với vấn đề đó, bánh sandwich. (Tham khảo XKCD, bạn được chào đón.) :)
BrianH 30/03/2015

4
Joel Spolsky được biết đến là người có những ý kiến ​​mạnh mẽ, gây tranh cãi. Xem FogBugz được viết bằng ngôn ngữ độc quyền ; Việc tiêm phụ thuộc quá phức tạp (btw, đây là câu trả lời gây tranh cãi nhất trên Stackoverflow trước khi bị đóng) ; Cơ sở dữ liệu XML chậm ; v.v.
BlueRaja - Danny Pflughoeft 30/03/2015

2
@BlueRaja: Umm ... cơ sở dữ liệu XML chậm, đặc biệt là so với cơ sở dữ liệu quan hệ. Kể từ khi đó là tranh cãi, hoặc một ý kiến?
Mason Wheeler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.