Bất cứ ai cũng có thể đề nghị các tiêu chuẩn mã hóa cho TSQL?


9

Chúng ta từ lâu đã có các tiêu chuẩn mã hóa cho mã .Net của chúng tôi và dường như có một số nguồn có uy tín cho các ý tưởng về cách áp dụng chúng phát triển theo thời gian.

Tôi muốn có thể tập hợp một số tiêu chuẩn cho SQL được viết bởi các sản phẩm của chúng tôi, nhưng dường như không có bất kỳ tài nguyên nào ngoài đó về sự đồng thuận cho những gì xác định SQL được viết tốt?


1
Pinal Dave có một danh sách các tiêu chuẩn mã hóa trên trang web của mình . Họ trông giống như một cơ sở công bằng cho một bộ tiêu chuẩn.
Sẽ có


1
@ Hủy bỏ chỉ bao gồm nhận dạng; không có gì về đặt tên, sử dụng con trỏ / thủ tục lưu trữ / lựa chọn của kiểu dữ liệu hoặc bất cứ điều gì thực sự ảnh hưởng đến chất lượng của mã ...
Rowland Shaw

1
chính xác, do đó tại sao tôi nói nó "liên quan", không phải là "trùng lặp".
Scott Whitlock

Câu trả lời:


6

Theo kinh nghiệm của tôi, những điều chính tôi muốn tìm là:

  • Đặt tên bảng và cột - xem xét bạn sử dụng ID, Tham chiếu hoặc Số cho các cột loại ID, số ít hoặc số nhiều cho tên (số nhiều là phổ biến cho tên bảng - ví dụ: THING, số ít cho tên cột - ví dụ THING_ID). Đối với tôi, điều quan trọng nhất ở đây là tính nhất quán giúp mọi người tránh lãng phí thời gian (ví dụ bạn không mắc lỗi chính tả khi ai đó đã đặt THING làm tên bảng vì bạn chỉ biết bằng trực giác rằng tên bảng không bao giờ là số ít).

  • Tất cả các tạo nên bao gồm một giọt (có điều kiện trên đối tượng hiện có) như là một phần của tệp của họ. Bạn cũng có thể muốn bao gồm các quyền cấp, tùy thuộc vào bạn.

  • Chọn, cập nhật, chèn và xóa nên được đặt ra một tên cột, một tên bảng và một mệnh đề / thứ tự theo mệnh đề trên mỗi dòng để chúng có thể dễ dàng nhận xét từng cái một trong quá trình gỡ lỗi.

  • Tiền tố cho các loại đối tượng đặc biệt là nơi chúng có thể bị nhầm lẫn (vì vậy v cho xem là quan trọng nhất). Không chắc chắn nếu nó vẫn áp dụng nhưng nó từng không hiệu quả đối với các thủ tục được lưu trữ ngoài các thủ tục hệ thống để bắt đầu sp_. Có lẽ cách tốt nhất để phân biệt chúng dù sao usp_ là những gì tôi đã sử dụng gần đây nhất.

  • Một tiêu chuẩn cho biết tên của trình kích hoạt sẽ bao gồm việc cập nhật / chèn / xóa và bảng áp dụng cho nó. Tôi không có tiêu chuẩn ưa thích nhưng đây là thông tin quan trọng và phải dễ tìm.

  • Tiêu chuẩn cho quyền sở hữu các đối tượng trong các phiên bản trước của SQL Server hoặc lược đồ nên tồn tại trong năm 2005 trở về sau. Đó là cuộc gọi của bạn, nhưng bạn không bao giờ nên đoán ai là người sở hữu thứ gì đó / nơi nó sống) và nếu có thể nên đưa lược đồ / chủ sở hữu vào tập lệnh CREATE để giảm thiểu khả năng nó được tạo sai.

  • Một chỉ số cho thấy bất cứ ai sử dụng CHỌN * sẽ được thực hiện để uống một nửa lít nước tiểu của chính họ.

  • Trừ khi có một lý do thực sự, thực sự tốt (không bao gồm sự lười biếng từ phía bạn), có, thực thi và duy trì các mối quan hệ khóa chính / khóa ngoại ngay từ đầu. Đây là sau khi tất cả một cơ sở dữ liệu quan hệ không phải là một tập tin phẳng và hồ sơ mồ côi sẽ làm cho cuộc sống hỗ trợ của bạn trở thành địa ngục tại một số điểm. Ngoài ra, xin lưu ý rằng nếu bây giờ bạn không làm điều đó Các mối quan hệ đúng đắn).

Tôi chắc chắn tôi đã bỏ lỡ điều gì đó nhưng đối với tôi, họ là những người thực sự mang lại lợi ích thực sự trong một số tình huống tốt.

Nhưng như với tất cả các tiêu chuẩn, ít hơn là nhiều hơn. Tiêu chuẩn mã hóa của bạn càng dài, mọi người càng ít có khả năng đọc và sử dụng chúng. Khi bạn vượt qua một vài trang có khoảng cách tốt, bắt đầu tìm cách loại bỏ những thứ không thực sự tạo ra sự khác biệt thực tế trong thế giới thực bởi vì bạn chỉ làm giảm cơ hội mọi người làm bất kỳ điều gì trong số đó.

EDIT: hai chỉnh sửa - bao gồm các lược đồ trong phần sở hữu, xóa một mẹo sai về số đếm (*) - xem các bình luận bên dưới.


1
Một số lựa chọn lạ ... "CHỌN COUNT (*)" có tệ không? Bạn đã bao giờ nghe nói về các lược đồ (không giống như chủ sở hữu) chưa? Những người khác của bạn là tốt mặc dù
gbn

1
@Jon Hopkins - Tôi biết tại sao nó xấu khi sử dụng CHỌN *. Sẽ thật tuyệt nếu bạn có thể nói tại sao sử dụng SELECT COUNT (*) là xấu.
k25

1
@gbn @ k25 - Vài năm trước (2002?) Tôi đã có một DBA rất nóng tính (*) nhưng Googling khi trả lời câu hỏi của bạn thì dường như điều này đã lỗi thời (nếu nó đã từng đúng). sqlservercentral.com/articles/Performance+Tuning/adviceoncount/ gợi (Yêu cầu đăng ký). Cô ấy chủ yếu là một DBA của Oracle, vì vậy đây có thể là một vấn đề thực sự mà cô ấy giả định cũng là một vấn đề đối với trình tối ưu hóa SQL.
Jon Hopkins

1
@gbn - Có, mặc dù tôi đã khá rảnh tay kể từ khi chúng được giới thiệu nên phản ứng tự động của tôi là người dùng. Tôi sẽ cập nhật câu trả lời cho các lược đồ.
Jon Hopkins

1
@gbn, @ k25 - Đào nhiều hơn về số lượng (*). Rõ ràng đây là một vấn đề trong Oracle 7 trở về trước, được sửa trong 8i và hơn thế nữa. Không rõ liệu nó có từng là một vấn đề trong SQL Server không nhưng chắc chắn không còn nữa. DBA của tôi đã hết hạn.
Jon Hopkins

3

Dường như không có bất kỳ nguồn lực nào ngoài sự đồng thuận cho những gì xác định SQL được viết tốt

Đó là bởi vì không có sự đồng thuận. Chỉ là một ví dụ, tôi sẽ có câu trả lời khác nhau cho ít nhất một nửa các mục trong danh sách của Jon Hopkins, và dựa trên số lượng chi tiết trong danh sách của anh ấy, đó là một phỏng đoán an toàn rằng cả hai chúng tôi đều làm việc với cơ sở dữ liệu để kiếm sống.

Điều đó nói rằng, một tiêu chuẩn mã hóa vẫn là một điều tốt để có, và một tiêu chuẩn mà mọi người trong nhóm hiểu và đồng ý là một điều tốt hơn, bởi vì tiêu chuẩn đó sẽ có nhiều khả năng được tuân theo.


1
+1. Tôi nghĩ điều quan trọng nhất là bạn đã có được sự nhất quán trong nhóm của mình.
Dean Harding

1
không quan tâm bạn sẽ làm gì khác nhau? Có phải chúng chủ yếu là vấn đề về hương vị (bố cục và vân vân) hoặc có bất kỳ lỗi "cứng" nào không?
Jon Hopkins

1
@Jon: không có lỗi cứng, chỉ những thứ chủ quan như tên bảng số ít, sự căm ghét của trình kích hoạt, v.v. BTW, "CHỌN *" vẫn ổn trong "EXISTS ()".
Larry Coleman

1
ví dụ công bằng (và tôi thường sử dụng nó với EXISTS và đừng ép mình uống nước tiểu).
Jon Hopkins

1

Ngoài câu trả lời của Jon Hopkins ...

  • Tách riêng đối tượng bên trong và bên ngoài

    • IX, UQ, TRG, CK, vv cho các ràng buộc và chỉ mục, v.v.
    • chữ thường hoặc CapsCase cho khách hàng phải đối mặt, ví dụ: uspT Breath_Add
  • Đối với các đối tượng bên trong, làm cho chúng rõ ràng nếu "không mặc định"

    • UQ = ràng buộc duy nhất
    • UQC = ràng buộc cụm duy nhất
    • PK = khóa chính
    • PKN = khóa chính không bao gồm
    • IX = chỉ số
    • IXU = chỉ số duy nhất
    • IXC = chỉ số cụm
    • IXCU hoặc IXUC = chỉ mục cụm duy nhất
  • Sử dụng lược đồ để đơn giản hóa việc đặt tên + quyền. Ví dụ:

    • Helper.xxx cho các procs nội bộ
    • HelperFn.xxx cho udfs
    • WebGUI.xxx cho một số mã phải đối mặt
    • Dữ liệu và / hoặc Lịch sử và / hoặc Phân đoạn cho các bảng
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.