c Dấu phẩy ‘,’ nên được sử dụng bên trái trong danh sách vì sẽ dễ dàng thêm một thành phần mới trong danh sách mà không phải thêm dấu phẩy vào thành phần cuối của danh sách trước khi thê
Trang 1MỤC LỤC
1 Thực trạng .1
2 Những yếu tố khách quan và chủ quan .1
3 Tên đề tài 1
4 Nội dung 1
4.1 Chuẩn viết code là gì? 1
4.2 Tại sao phải sử dụng chuẩn viết code? 1
4.3 Các chuẩn viết code SQL Server 1
4.3.1 Các định nghĩa 2
4.3.2 Định dạng và thụt lề 2
4.3.3 Đặt tên cho các đối tượng 6
4.3.4 Một số qui tắc khác 10
5 Phạm vi áp dụng, khả năng phổ biến 13
6 Thời điểm áp dụng 13
7 Hiệu quả mang lại 13
Kết luận 14
Tài liệu tham khảo 15
Trang 21 Thực trạng
Hiện nay, khoa Công nghệ thông tin trường cao đẳng Công Nghệ Thủ Đức đào tạo
cử nhân ngành Công nghệ thông tin, Truyền thông và mạng máy tính, Thiết kế đồ họa Trong đó, sinh viên hai ngành Công nghệ thông tin, Truyền thông và mạng máy tính được học một số học phần có sử dụng ngôn ngữ lập trình Các sinh viên khi sử dụng ngôn ngữ lập trình thường quan tâm đến cú pháp, câu lệnh, dữ liệu, giải thuật để giải quyết bài toán mà chưa quan tâm đến các qui tắc khi viết code
Khi viết code không theo một qui tắc nào sẽ gây mất nhiều thời gian và chi phí cho việc bảo trì cũng như không đảm bảo chất lượng cho phần mềm
Hiện tại, trong học phần cơ sở dữ liệu có sử dụng hệ quản trị SQL Server, trong đó ngôn ngữ SQL được sử dụng để viết code Nhưng vẫn chưa có một bộ qui tắc cho ngôn ngữ này được áp dụng cho sinh viên của khoa
2 Những yếu tố khách quan và chủ quan
Yếu tố khách quan: viết code theo chuẩn là một yêu cầu của các doanh nghiệp đối với người lập trình
Yếu tố chủ quan: giúp sinh viên hình thành kỹ năng viết code SQL Server theo chuẩn
3 Tên đề tài
Chuẩn viết code SQL Server
4 Nội dung
4.1 Chuẩn viết code là gì?
Coding Standard hay coding conventions là tập hợp những nguyên tắc được định nghĩa để ràng buộc trong quá trình viết code của toàn dự án
Coding Standard có những cái chung và cái riêng tùy thuộc vào ngôn ngữ
và cộng đồng nhưng hầu hết được cộng nhận và đi theo bởi đa số các lập trình viên trên thế giới
4.2 Tại sao phải sử dụng chuẩn viết code?
Việc áp dụng các qui tắc khi viết code sẽ giúp cho chương trình dễ đọc, có qui tắc hơn, đẹp hơn do đó sẽ dễ quản lý, dễ bảo trì hơn
Góp phần lớn trong việc đảm bảo chất lượng code, ít bị lỗi
Khi làm việc nhóm, việc trao đổi giữa các thành viên trong nhóm, giữa các thành viên khác nhóm cần có một qui tắc chung để đảm bảo công việc được thống nhất, mỗi thành viên đều có thể sử dụng được sản phẩm của thành viên khác
Việc tuân thủ các qui tắc sẽ dễ dàng hơn trong việc kế thừa cho người sau 4.3 Các chuẩn viết code SQL Server
Trang 34.3.1 Các định nghĩa
a) PascalCase: kí tự đầu tiên của mỗi từ được viết hoa
Ví dụ: FirstName
b) camelCase: kí tự đầu tiên của mỗi từ được viết hoa ngoại trừ từ đầu tiên được viết thường
Ví dụ: firstName
c) UPPERCASE: tất cả các kí tự được viết hoa Sử dụng kiểu này cho các
từ viết tắt và các từ khóa trong câu lệnh T-SQL
Ví dụ: ADO, SELECT Id FROM Table 4.3.2 Định dạng và thụt lề
a) Sử dụng 4 khoảng trắng cho thụt lề: sử dụng 4 khoảng trắng cho thụt lề trong các file nguồn(script) và bảo đảm sự thống nhất này cho tất cả các file nguồn
b) Mỗi hàng nên có độ dài tối đa khoảng 87 kí tự; nếu code quá dài, nó sẽ bị cuộn xuống hàng dưới và khi in ra nó sẽ bị nhảy xuống hàng dưới, khi đó code sẽ rất khó đọc
c) Dấu phẩy (‘,’) nên được sử dụng bên trái trong danh sách vì sẽ dễ dàng thêm một thành phần mới trong danh sách mà không phải thêm dấu phẩy vào thành phần cuối của danh sách trước khi thêm, đồng thời cũng sẽ dễ dàng nhìn thấy lỗi do dấu phẩy gây ra; thụt lề cho những hàng có dấu phẩy thì giảm đi 1 kí tự so với thụt lề bình thường, điều này sẽ giúp cho hàng đầu và những hàng sau thẳng hàng
Ví dụ:
,@authorName nvarchar(max)
d) Dấu ngoặc luôn được xuất hiện trên một hàng riêng; trong trường hợp sử dụng nhiều dấu ngoặc, các dấu ngoặc không nên thụt lề so với hàng trước nó; tất cả những thành phần bên trong dấu ngoặc nên được thụt lề, bao gồm cả dấu ngoặc bên trong
Ví dụ:
WHERE
Trang 4t2.[Col4] = 3
AND t2.[Col4] > 5
e) BEGIN và END luôn được xuất hiện trên một dòng riêng; BEGIN và END không nên thụt lề so với dòng trước đó; tất cả những thành phần bên trong BEGIN và END nên được thụt lề, bao gồm cả BEGIN và END bên trong; khi có nhiều hàng bên trong BEGIN và END thì nên có chú thích cho END vì nó sẽ dễ dàng hơn trong việc kết hợp với BEGIN
Ví dụ:
IFEXISTS(SELECT*FROM #table) BEGIN
–do something END
ELSE BEGIN –do something else END
f) Dùng dấu ngoặc vuông để bao các đối tượng/cột Tham chiếu các đối tượng bằng tên chủ sở hữu(owner)/lược đồ(schema)
Ví dụ:
SELECT
[CountryCode]
, [CountryName]
, [CountryFlag]
FROM
[dbo].[Country]
g) Tất cả các từ khóa được viết hoa
Trang 5Ví dụ: SELECT, FROM h) Tất cả các kiểu dữ liệu được viết bằng kí tự thường
Ví dụ: int, nvarchar(50) i) Bí danh cho Table: các Table nên được đặt bí danh(alias); các bí danh được viết bằng chữ thường; tốt nhất là dùng kí tự đầu tiên của mỗi từ để đặt tên bí danh Trong trường hợp gây ra xung đột, sử dụng hậu tố với một thuật ngữ để phân biệt các bí danh trong truy vấn
Ví dụ:
FROM [dbo].[Customer] c FROM
[dbo].[CustomerAddress] ca FROM
[dbo].[Tree] t_parent JOIN [dbo].[Tree] t_child ON… j) Danh sách các cột: mỗi cột bắt đầu trên một dòng mới; thụt lề danh sách các cột từ từ khóa trước đó
Ví dụ:
SELECT
[CountryCode]
, [CountryName]
, [CountryFlag]
FROM
[dbo].[Country]
k) Qui định chung cho SELECT, UPDATE, DELETE, INSERT: trong các câu lệnh này, các mệnh đề FROM, WHERE, GROUP BY, HAVING, SET nên được viết trên một dòng mới, thụt lề bằng với câu lệnh đầu l) Câu lệnh UPDATE: luôn sử dụng tên bí danh cho Table trong câu lệnh
và tham chiếu Table trong mệnh đề FROM
Ví dụ:
Trang 6UPDATE a SET [AuthorName] = @authorName ,[AuthorAge] = @authorAge FROM
[dbo].[Author] a m) Câu lệnh INSERT: luôn sử dụng danh sách các cột; tuân thủ các qui định
về dấu ngoặc và danh sách cột
Ví dụ:
INSERTINTO [dbo].[Author]
( [AuthorName]
[AuthorAge]
) n) Mệnh đề FROM: thụt lề danh sách Table trong mệnh đề FROM; các phép kết nên bắt đầu trên một dòng mới; nếu như dòng quá dài thì từ khóa ON nên bắt đầu trên một dòng mới, thụt lề bằng với tên bảng đầu tiên
o) Mệnh đề WHERE, HAVING: thụt lề tất cả các mệnh đề trong WHERE; mỗi mệnh đề nên bắt đầu trên một dòng mới; nếu có nhiều mệnh đề, thêm thụt lề để kí tự đầu tiên của mỗi mệnh đề được xếp thẳng hàng
Ví dụ:
WHERE table.[AuthorName] =‘Steve’
AND table.[AuthorAge] > 30
p) Mệnh đề ORDER BY, GROUP BY: thụt lề theo qui ước của danh sách cột, mỗi cột bắt đầu trên một dòng mới
Ví dụ:
Trang 7table.[AuthorLastName]
q) Mệnh đề CASE: thụt lề tất cả các từ WHEN, ELSE trong mệnh đề CASE, thụt lề từ END bằng với từ CASE
Ví dụ:
CASE WHEN t1.[Col1] = 1 THEN‘First’
WHEN t1.[Col1] = 2 THEN‘Second’
END r) IF, WHILE: trong IF và WHILE luôn sử dụng BEGIN…END; WHILE,
IF và END luôn bắt đầu trên một dòng mới; mỗi mệnh đề nên ở một dòng mới ngoại trừ mệnh đề đầu tiên; nếu có nhiều mệnh đề, thêm thụt lề
để kí tự đầu tiên của mỗi mệnh đề được xếp hàng
Ví dụ:
IFEXISTS(SELECT*FROM #table) AND @debug = true
BEGIN –do something
END ELSE BEGIN –do something else END
4.3.3 Đặt tên cho các đối tượng
a) Tên Database, tên File: tên Database cần phản ảnh chính xác nội dung và chức năng của Database; không sử dụng khoảng trắng trong tên của Database; tên File phải trùng với tên Database; tên Database và File đặt tên theo kiểu PascalCase
b) Tên lược đồ(schema): sử dụng các kí tự viết thường để đặt tên cho lược đồ; các đối tượng; các đối tượng có bí danh luôn luôn sử dụng tên lược
Trang 8đồ, ngay cả trong trường hợp sử dụng lược đồ mặc định (dbo); áp dụng cho câu lệnh CREATE và cho các đối tượng được tham chiếu trong mệnh đề FROM, INSERT hoặc UPDATE
Ví dụ: [HumanResources].[Employee], [dbo].[Runner]
c) Tên Table: đặt tên theo kiểu PascalCase; sử dụng các kí tự và kí số; không sử dụng dấu gạch chân; không sử dụng tiền tố; tên Table sử dụng danh ở dạng số ít
Ví dụ: User, không sử dụng Users
d) Tên Table liên kết: tên Table liên kết nên được đặt tên bằng tên của 2 Table mà nó liên kết lại, thêm hậu tố Link
Ví dụ: tên Table được liên kết từ Table User và Group là UserGroupLink
e) Tên Cột (Column): đặt tên theo kiểu PascalCase; sử dụng các kí tự và kí số; không sử dụng dấu gạch chân; không sử dụng tiền tố
Cột có tham gia vào khóa chính nên có hậu tố ‘ID’, khi đó tên cột có dạng <table name>ID Ví dụ: table Product có cột tên là ProductID
Cột là khóa ngoại thì tên cột giống với cột khóa chính mà nó tham chiếu tới Ví dụ, khóa chính của table ProductModel là
‘ProductModelID’, table Product có khóa ngoại tham chiếu đến bảng ProductModel thì nó có tên là ProductModelID’
Nếu cột có kiểu dữ liệu là bit (boolean) thì nên thêm tiền tố ‘Is’ Ví
dụ, IsEnabled
f) Tên Stored Procedure: đặt tên theo kiểu PascalCase; không sử dụng các
kí tự đặc biệt; không sử dụng tiền tố; tên được đặt theo thứ tự sau: tên Table, hành động (Save, Load, Get, Set, SetSingle, Search, Delete,…),
mô tả nếu cần để làm rõ ý nghĩa của Stored Procedure
Ví dụ: AuthorSave, AuthorLoadByAuthorID, AuthorLoadByName g) Tên User Defined Function: đặt tên theo kiểu PascalCase; tên được đặt theo thứ tự sau: sử dụng tiền tố ‘FN_’, tên Table hoặc tên kết hợp các Table sau dấu gạch chân, từ chỉ hành động (Get, Set, Search, Delete,…),
mô tả nếu cần để làm rõ ý nghĩa của Function
Ví dụ: FN_Author, FN_AuthorGetID
h) Tên của tham số: đặt tên theo kiểu PascalCase
Ví dụ: @FirstName
Trang 9i) Tên biến: đặt tên theo kiểu camelCase; không đặt tên biến bằng từ viết tắt hay tên biến chỉ có 1 kí tự
Ví dụ: @firstName, không nên đặt @c
j) Tên Cursor: đặt tên theo kiểu PascalCase; tên được đặt theo thứ tự sau: tiền tố ‘CURSOR_’, tên Table mà con trỏ duyệt dữ liệu
Ví dụ: DECLARE CURSOR_Employee CURSOR FOR…
k) Tên View: đặt tên theo kiểu PascalCase; sử dụng tiền tố ‘VW_’, tên các Table liên quan, thêm các từ mô tả để làm rõ ý nghĩa của View nếu cần
Ví dụ, VW_ VendorWithAddresses
l) Tên Trigger: đặt tên theo kiểu PascalCase; tên được đặt theo thứ tự sau:
sử dụng tiền tố ‘TRG’, loại Trigger(A: after, I: instead of), dấu gạch chân, tên Table cài trigger, hành động (Upd: update, Ins: insert, Del: delete)
Ví dụ: TRGA_ProductDel, TRGA_CustomerInsUpd m) Tên Index: sử dụng tiền tố ‘IX’, nếu là Clustered Index thì thêm ‘C’, nếu
là Unique Index thì thêm ‘U’, dấu gạch chân, danh sách các cột là Index (sử dụng dấu gạch chân giữa các cột)
Ví du: IXCU_AuthorID, IX_AuthorID_AuthorName, IXC_AuthorID n) Tên Primary key: sử dụng tiền tố ‘PK’, dấu gạch chân, tên Table cài khóa chính
Ví dụ: PK_Customer o) Tên Foreign key: sử dụng tiền tố ‘FK’, dấu gạch chân, tên Table được tham chiếu, dấu gạch chân, tên Table cài khóa ngoại
Ví dụ: tạo khóa ngoại cho Table Customer tham chiếu đến Table Country thì tên được đặt là FK_Country_Customer
p) Tên Default: sử dụng tiền tố ‘DF’, dấu gạch chân, tên Table cài default, dấu gạch chân, tên cột cài default
Ví dụ: tạo default cho cột Gender trong Table Author thì tên được đặt là DF_Author_ Gender
q) Tên Check: sử dụng tiền tố ‘CK’, dấu gạch chân, tên Table cài check, một số nguyên dùng để phân biệt các check khác trong cùng một Table
Ví dụ: CK_Author1
Trang 11Bảng tóm tắt về qui ước đặt tên cho các đối tượng trong SQL Server
4.3.4 Một số qui tắc khác
a) Tên các đối tượng, tên biến, tên cột nên có độ dài nhỏ hơn 50 kí tự b) Sử dụng 1 dòng trống để chia ra các nhóm code khác nhau
c) Sử dụng khoảng trắng để các biểu thức được đọc như là câu
Ví dụ: Color = ‘red’, không sử dụng Color=‘red’
Trang 12d) Chú thích(Comment)
Sử dụng comment cho mỗi khối code:
Chú thích viết trên cùng một dòng, sử dụng ‘ ’ trước dòng chú thích
Chú thích viết trên nhiều dòng, sử dụng ‘/*…*/’
e) Khi sử dụng các phép logic phức tạp thì sử dụng dấu ngoặc để dễ đọc Ví
dụ, WHERE
(Color = ‘red’
AND
( Size = 1
OR Size = 2 )
) f) Không sử dụng phép kết RIGHT JOIN, mà viết lại bằng phép kết LEFT JOIN
g) Khi sử dụng phép INNER JOIN thì bỏ từ INNER
h) Khi sử dụng phép kết:
SELECT
d
FROM
Table1
, Table2
WHERE
Table1 d = Table2
SELECT
d
FROM
Table1
JOIN
Table2
ON
Table1 d = Table2
i) Chỉ sử dụng chú thích để làm sáng tỏ những điều không rõ trong việc đọc code
j) Không sử dụng SELECT * trong câu lệnh truy vấn, thay vào đó sử dụng danh sách các cột sau mệnh đề SELECT
k) Sử dụng SET NOCOUNT ON tại đầu của Batch, Stored Procedure, Trigger
l) Cột có cài đặt ràng buộc Default không cho phép NULL
m) Không sử dụng số thứ tự cột trong mệnh đề ORDER BY, thay vào đó sử dụng tên cột
Trang 13Không sử dụng: Sử dụng:
SELECT
[UserID]
, [UserName]
, [Password]
FROM
dbo [UserDetails]
ORDER BY 2
SELECT
[UserID]
, [UserName]
, [Password]
FROM
dbo [UserDetails]
ORDER BY [UserName]
n) Sử dụng Code Header: nên sử dụng Code Header cho Stored Procedure, Trigger, Function theo cách sử dụng Comment; phần Header này sẽ mô
tả chức năng, hướng dẫn cũng như định nghĩa các tham số
CREATE PROCEDURE [dbo].[ValidateConcurrency]
@TableName varchar(255),
@ID int,
@LastUpdate datetime,
@IsValid bit OUTPUT
AS /********************************************************* This procedure validates the concurrency of a record update by taking the LastUpdate date passed in and checking it against the current LastUpdate date of the record If they do NOT match the record is not updated because someone has updated the record out from under the user
- Parameter Definition:
-
@TableName = Table to be validated
@ID = Record ID of the current record to be validated
@LastUpdate = The Last Update Date passed by app to compare with current date value for the record
@IsValid = Returns the following back to the calling app
1 = Record is valid No concurrancy issues
0 = Record is NOT concurrent
*********************************************************/ o) Sử dụng comment Header để mô tả thông tin file script cũng như theo dõi sự thay đổi nội dung của file script
/******************************************
** File:
Trang 14** Name:
** Desc:
** Auth:
** Date:
**************************
** Change History
**************************
** PR Date Author Description
** - - -
** 1 01/10/2008 Dan added inner join
******************************************/
5 Phạm vi áp dụng, khả năng phổ biến
Chuẩn code này có khả năng áp dụng cho sinh viên khoa Công nghệ thông tin, trường cao đẳng Công Nghệ Thủ Đức
6 Thời điểm áp dụng
Áp dụng vào học kỳ hai, năm nhất
7 Hiệu quả mang lại
Trang bị cho sinh viên kỹ năng viết code SQL Server theo chuẩn chung