Archive for the ‘Thiết kế database’ Category

 

Dữ Liệu Kiểu DATE Và Kiểu TIME

Cùng với loại dữ liệu DATETIME để chứa dữ liệu kiểu ngày giờ, SQL Server 2008 bổ sung thêm hai kiểu dữ liệu là DATE cho ngày riêng và TIME cho giờ riêng.

CREATE TABLE #t (d DATE, ti TIME)
 
INSERT INTO #t VALUES(GETDATE(), GETDATE())
INSERT INTO #t VALUES('2013-06-21', '03:23pm')
INSERT INTO #t VALUES('2013-06-21', '14:13')
INSERT INTO #t VALUES('2013-06-21', '16:36:12.124')

Như ở ví dụ trên, bạn thấy khi thêm dữ liệu kiểu DATETIME vào trường kiểu DATE, chỉ dữ liệu phần DATE được lưu lại và phần TIME bị cắt bỏ. Và khi thêm dữ liệu kiểm DATETIME vào trường kiểu TIME, chỉ dữ liệu phần TIME được giữ lại còn phần DATE bị cắt bỏ. Trường kiểu TIME cũng nhận dữ liệu với khuôn dạng và độ chính xác khác nhau.
Việc tách DATE và TIME làm hai kiểu dữ liệu làm tăng tính linh hoạt cho ứng dụng. Ví dụ khi bạn cần lưu thông tin các lần xảy ra mất điện ở các vùng trong một tỉnh, có thể có lần bạn chỉ nhận được thông tin về ngày mà không có giờ cụ thể. Trong trường hợp này, ở các phiên bản trước, khi lưu vào trường DATETIME, phần thông tin về thời điểm sẽ tự động được đặt thành 00:00:00 (nửa đêm), tuy nhiên điều này có thể gây nhầm lẫn vì có thể có lần mất điện xảy ra chính xác vào lúc nửa đêm. Điều này trở nên quan trọng hơn khi bạn lưu kèm theo thời điểm điện được khôi phục trở lại, chẳng hạn để đánh giá tốc độ khôi phục sự cố. Với những lần mất điện mà không thu thập được thời điểm, khoảng thời gian mất điện luôn được tính bắt đầu từ lúc 00:00:00 và như vậy là sai.
Khi tách làm hai trường DATE và TIME, bạn có thể nhập ngày và giờ mất điện vào hai trường và khi không có dữ liệu về giờ, trường sẽ chứa NULL. Khi phân tích dữ liệu, bạn phân biệt được trường hợp nào có giờ và trường hợp nào không để tính toán cho chính xác.
Trường kiểu DATE khi được chuyển thành kiểu DATETIME sẽ tự động thêm ’00:00:00′ vào phần thời gian. Còn trường kiểu TIME khi được chuyển thành kiểu DATETIME sẽ được cộng thêm ’1900-01-01′ vào phần ngày tháng. Bạn cũng có thể ghép hai trường kiểu DATE và TIME để tạo thành dữ liệu kiểu DATETIME. Hãy xem các tình huống ở ví dụ dưới:

SELECT CAST(d AS DATETIME), CAST(ti AS DATETIME),
	CAST(d AS DATETIME) + CAST(ti AS DATETIME)
FROM #t
Posted on 7/6/2013 by Vũ Huy Tâm | Categories: Thiết kế database

Index Partitioning

Với một bảng đã được phân đoạn, mỗi index được tạo ra theo mặc định được phân đoạn theo giống như bảng. Ví dụ bảng được phân đoạn theo năm của ngày giao dịch thì index cũng được phân đoạn theo cách đó. Index khi đó được gọi là aligned với bảng. Tuy nhiên bạn cũng có thể không phân đoạn cho index và để nó nguyên một khối, hoặc phân đoạn theo cách khác. Khi đó index được gọi là non-aligned.
Bạn hãy hình dung bảng như một cái bánh tét, và index là sợi lạt buộc xung quanh. Khi phân đoạn, chiếc bánh được cắt thành từng lát. Nếu sợi lạt cũng được cắt theo và mỗi sợi con giờ buộc xung quanh từng lát bánh, sợi lạt được gọi là aligned với chiếc bánh. Nếu sợi lạt không được cắt và vẫn bao xung quanh cả chiếc bánh to, sợi lạt được gọi là non-aligned với chiếc bánh.
SQL Server luôn ưu tiên phân đoạn index để nó aligned với bảng và luôn cố gắng phân đoạn khi có thể, vì nó đem lại nhiều thuận lợi cho các tác vụ trên bảng. Tuy nhiên khi đi vào chi tiết từng loại index, cách cư xử này được thể hiện qua những sắc thái khác nhau, ta sẽ xem xét kỹ hơn ở dưới đây. … đọc tiếp »

Posted on 7/5/2013 by Vũ Huy Tâm | Categories: Index, Table partitioning, Thiết kế database

Filegroup Trong SQL Server

Filegroup là tên đặt cho một nhóm data file trong SQL Server. Filegroup không chứa dữ liệu, mà chỉ định nghĩa ở mức logic các data file nằm trong đó, và đến lượt các data file này mới thực chứa dữ liệu. Bạn có thể hình dung filegroup giống như một thư mục của Windows, và các data file thuộc về filegroup đó tương tự như các file trong thư mục. Khi bạn tạo một database, ở mức đơn giản nhất sẽ có hai file được tạo ra là một log file (.ldf) và một data file (.mdf). Tuy nhiên một điều có thể bạn ít để ý hơn là cũng có một filegroup được tạo ra cùng với nó: … đọc tiếp »

Posted on 8/8/2012 by Vũ Huy Tâm | Categories: Database Administration, Thiết kế database

Lựa Chọn Khóa Chính: Khóa Đại Diện vs. Khóa Tự Nhiên

Khóa đại diện (surrogate key) là khóa không có liên hệ nào với dữ liệu mà hoàn toàn chỉ được dùng làm định danh cho bản ghi. Một ví dụ điển hình của khóa đại diện là cột IDENTITY: với mỗi bản ghi được thêm mới, cột IDENTITY tự động tăng lên và nhận một giá trị mới. Giá trị này tăng tuần tự và không có dính dáng gì với dữ liệu của các cột khác.
Khóa tự nhiên (natural key) là định danh của bản ghi theo logic của dữ liệu, tức là nó định danh bản ghi một cách tự nhiên. Ví dụ (đơn giản hóa): bảng SanPham (sản phẩm) có khóa tự nhiên là kết hợp của HangSX (hãng sản xuất) và TenSP (tên sản phẩm).

HangSX TenSP TrongLuong KichThuoc
Apple iPad 2
Apple The new iPad
Samsung Galaxy tab 10.1
Microsoft Surface

 

Khi chọn cột làm khóa chính cho bảng, bạn thường lựa chọn loại khóa nào trong hai loại trên? Ta hãy so sánh hai thiết kế dưới đây. … đọc tiếp »

Posted on 24/7/2012 by Vũ Huy Tâm | Categories: Thiết kế database

Các Loại Ràng Buộc Trong SQL Server

Ràng buộc trong SQL Server được dùng để duy trì tính nhất quán của dữ liệu, đảm bảo dữ liệu phù hợp với các qui định theo yêu cầu của bài toán. Ví dụ một database về bán hàng đòi hỏi mỗi bản ghi phải có ID sản phẩm hợp lệ, số lượng bán phải là một số nguyên và giá bán phải lớn hơn 0. Đó là các yêu cầu về tính nhất quán của dữ liệu và các ràng buộc cần được khai báo để thực thi các yêu cầu này. Do đó, ràng buộc giúp ngăn chặn dữ liệu không hợp lệ và chỉ cho phép dữ liệu hợp lệ được lưu vào database.
SQL Server cung cấp các loại ràng buộc sau: … đọc tiếp »

Posted on 28/11/2011 by Vũ Huy Tâm | Categories: Thiết kế database

Switch In Và Switch Out Với Table Partitioning

Một trong những ưu điểm của phân đoạn bảng là bạn có thể dễ dàng loại bỏ một lượng lớn bản ghi ra khỏi bảng, cũng như dễ dàng nhập một lượng lớn bản ghi vào bảng, thay vì phải sử dụng các lệnh INSERT và DELETE.

Ví dụ, bạn có bảng BanHang chứa dữ liệu bán hàng qua nhiều năm. Nay nhận thấy dữ liệu của năm 2010 không còn cần dùng đến thường xuyên, bạn muốn chuyển dữ liệu này sang một bảng khác để giảm nhẹ bảng chính. Nếu không có partition, bạn phải dùng hai lệnh: INSERT vào bảng mới và DELETE trên bảng chính với điều kiện năm = 2010. Hai lệnh này đều rất tốn kém vì mỗi bản ghi được thêm/xóa đều được ghi vào transaction log. Khi bảng được phân đoạn theo năm, bạn có thể dễ dàng chuyển đoạn cho 2010 sang bảng mới. Thao tác này gọi là switch out. Vì đây là thao tác DDL, dữ liệu sẽ được di chuyển tức thì.

Một ví dụ khác, bạn làm việc ở trung tâm dữ liệu của một hội sở ngân hàng, … đọc tiếp »

Giới thiệu về View

Trong buổi SQL SERVER SEMINAR HÈ 2011 có một bài thảo luận về Indexed View. Để tiện cho các bạn theo dõi tôi sẽ giới thiệu sơ qua về khái niệm VIEW và một số kiến thức liên quan đến việc sử dụng VIEW.

Giới thiệu về View

View là một bảng ảo mà dữ liệu chứa trong nó được mô tả bởi một câu truy vấn.
Ví dụ về tạo 1 View đơn giản: … đọc tiếp »

Table Partitioning – Các Khái Niệm Cơ Bản

Bài Table Partitioning Trong SQL Server giới thiệu về kỹ thuật phân đoạn của SQL Server và cũng giới thiệu qua các khái niệm xung quanh kỹ thuật này, như partition function, partition schema, filegroup. Bài viết này đề cập chi tiết hơn các khái niệm trên để giúp bạn hiểu thêm về kiến trúc partitioning của SQL Server. … đọc tiếp »

Table Partitioning Trong SQL Server

Table partitioning là kỹ thuật phân chia bảng thành từng đoạn nhằm quản lý hiệu quả cơ sở dữ liệu với dung lượng lớn. Đây là tính năng mới được đưa vào SQL Server 2005 và tiếp tục được tăng cường ở phiên bản 2008. Đối với các ứng dụng truy cập từ bên ngoài, bảng (table) vẫn là một bảng duy nhất, chỉ có cấu trúc vật lý của nó là khác so với các bảng không phân đoạn. … đọc tiếp »

Phân Đoạn Bảng Theo Chiều Dọc

Khi làm việc với một bảng rộng gồm rất nhiều cột, trong đó chỉ có một số cột được truy cập thường xuyên, bạn có thể tăng hiệu năng cho câu truy vấn trên các cột này bằng cách tách chúng ra một bảng riêng. Khi đó thay vì có một bảng rộng như ban đầu thì nay bạn có hai bảng: một bảng gồm nhóm các cột được dùng thường xuyên, và một bảng gồm các cột còn lại. Cả hai bảng đều chứa cột khóa chính để giữ liên hệ với nhau. Lúc này quan hệ giữa hai bảng là quan hệ 1-1. Trong trường hợp cần thiết, bảng ban đầu có thể được tách làm nhiều hơn hai bảng. Kỹ thuật này gọi là phân đoạn bảng theo chiều dọc (vertical partitioning). Nói nôm na là bổ dọc bảng thành nhiều mảnh. … đọc tiếp »

Posted on 22/11/2010 by Vũ Huy Tâm | Categories: Performance tuning, Thiết kế database