[BÀI ĐỌC THÊM]
Bài viết này giới thiệu 1 số đối sách để chọn Primary Key cho một Table trong CSDL quan hệ.
Thỉnh thoảng bạn sẽ thấy có người thiết kế sử dụng một thuộc tính có ý nghĩa làm khóa chính (Natural Key), thỉnh thoảng cột khóa chính chỉ đơn giản là để định danh một bản ghi (Surrogate Key) Ví dụ: trường số tự tăng .Vậy nên làm như nào cho đúng, về cơ bản, không có câu trả lời rõ ràng về việc bạn nên thích cái gì hơn, trong từng trường hợp cụ thể mỗi loại keys có ưu- nhược riêng của nó. Bài viết này mang lại một đánh giá khách quan về 2 loại keys trên.
1. Một số "Từ khóa" (Terminology) về các Keys
Key. A key is one or more data attributes that uniquely identify an entity. In a physical database a key would be formed of one or more table columns whose value(s) uniquely identifies a row within a relational table.
Composite key. A key that is composed of two or more attributes.
Natural key. A key that is formed of attributes that already exist in the real world. For example, U.S. citizens are issued a Social Security Number (SSN) that is unique to them (this isn't guaranteed to be true, but it's pretty darn close in practice). SSN could be used as a natural key, assuming privacy laws allow it, for a Person entity (assuming the scope of your organization is limited to the U.S.).
Surrogate key. A key with no business meaning.
Candidate key. An entity type in a logical data model will have zero or more candidate keys, also referred to simply as unique identifiers (note: some people don't believe in identifying candidate keys in LDMs, so there's no hard and fast rules). For example, if we only interact with American citizens then SSN is one candidate key for the Person entity type and the combination of name and phone number (assuming the combination is unique) is potentially a second candidate key. Both of these keys are called candidate keys because they are candidates to be chosen as the primary key, an alternate key or perhaps not even a key at all within a physical data model.
Primary key. The preferred key for an entity type.
Alternate key. Also known as a secondary key, is another unique identifier of a row within a table.
Foreign key. One or more attributes in an entity type that represents a key, either primary or secondary, in another entity type.
Hãy xem xét conceptual Design trong Hình 1
Hình 1: Mô hình UML mô tả quan hệ Customer và Address
Trong Hình 1, bảng Customer có column CustomerNumber làm Primary Key và SocialSecurityNumber làm alternate key. Điều này chỉ ra rằng cách tốt nhất để truy cập thông tin khách hàng là thông qua giá trị CustomerNumber mặc dù phần mềm của bạn có thể nhận được cùng một thông tin nếu nó có số SocialSecurityNumber (an sinh xã hội) của người đó. Bảng CustomerHasAddress có một khóa chính là composite key (được kết hợp từ nhiều hơn 1 columns), sự kết hợp của CustomerNumber và AddressID. Foreign Key (khóa ngoại) được sử dụng để duy trì mối quan hệ giữa các thực thể. Ví dụ, các mối quan hệ giữa các rows trong bảng CustomerHaAddress và bảng Customer được duy trì bởi cột CustomerNumber bên trong bảng CustomerHasAddress. Cột CustomerNumber là một phần của khóa chính cho CustomerHasAddress cũng như khoá ngoại tham chiếu tới bảng Customer. Tương tự, cột AddressID là một phần của khóa chính của CustomerHasAddress cũng như khoá ngoại tham chiếu tới bảng Address để duy trì mối quan hệ với các hàng của Address.
2. So sánh 2 loại khóa: Surrogate Key và Natural Key
Natural keys: là một hoặc nhiều thuộc tính có sẵn, đặc tính của các thuộc tính này là đơn nhất trong ngữ cảnh nghiệp vụ (ví dụ số chứng minh thư nhân dân của sinh viên) . Đối với bảng Customer trong ví dụ trên có hai Candidate Keys, trong trường hợp này là CustomerNumber và SocialSecurityNumber.
Surrogate key: là một cột mới,là một key không có ý nghĩa trong ngữ cảnh của nghiệp vụ. Một ví dụ là cột AddressID của bảng Address trong Hình 1. Các địa chỉ không có khóa tự nhiên bởi vì bạn sẽ cần phải sử dụng tất cả các cột của bảng Address để tạo một khoá cho chính nó , do đó giới thiệu một Surrogate key là một lựa chọn tốt hơn trong trường hợp này.
Lợi thế của các natural keys là chúng tồn tại, bạn không cần phải đưa ra một giá trị "không tự nhiên" mới cho database schema của mình. Tuy nhiên, bất lợi của chìa khóa tự nhiên là bởi vì chúng có ý nghĩa về mặt nghiệp vụ do đó nó sẽ gắn chặt với nghiệp vụ của bạn(rất khó thay đổi): bạn có thể cần phải đặt lại Key khi các yêu cầu nghiệp vụ của bạn thay đổi. Ví dụ: nếu người dùng của bạn quyết định sử dụng CustomerNumber là chữ thay vì số, ngoài việc cập nhật database schema cho bảng Customer (bạn không thể tránh khỏi), bạn cũng phải thay đổi từng bảng mà CustomerNumber được sử dụng làm khoá ngoại.
Surrogate Key cũng có ưu điểm của nó: Thứ nhất là nó không liên quan đến nghiệp vụ của bạn (ta chỉ thuần túy sử dụng nó với mục đíchkỹ thuật) do đó nó sẽ rất dễ maintain (giả sử ta đã có một chiến lượt tốt) . Thứ hai,nếu sử dụng surrogate key trên hầu hết các bảng ta có thể làm giảm số lượng mã nguồn mà bạn cần viết, giảm tổng chi phí sở hữu (TCO) của các hệ thống mà bạn xây dựng. Bất lợi cơ bản của Surrogate Keys là chúng thường không phải là dạng con người có thể đọc được, làm cho chúng khó khăn cho người dùng cuối khi làm việc với nó.
3. Các đối sách để implement Surrogate Key
Key values assigned by the database: hầu hết các hãng cung cấp DBMS đều cung cấp các công cụ để implement Surrogate Key gọi là các incremental keys. (số tự tăng). Trong MS SQL Server bạn có thể đặt ràng buộc IDENTITY để tạo trường tự tăng, và sử dụng build-in variable @@IDENTITY để lấy được giá trị mới trong DB. Trong ORACLE bạn có thể sử dụng các SEQUENCE (một loại đối tượng trong CSDL) để làm việc này.
MAX() + 1: Một chiến lược chung là sử dụng một cột số nguyên, bắt đầu giá trị cho bản ghi đầu tiên ở vị trí 1, sau đó cho một hàng mới đặt giá trị cho giá trị cực đại trong cột này cộng với một sử dụng hàm SQL MAX (cách này ko được hay lắm)
Universally unique identifiers (UUIDs): UUIDs là các giá trị 128-bit được tạo ra từ một thẻ băm của ID của thẻ Ethernet của bạn, hoặc một phần mềm tương đương, và datetime hiện tại của hệ thống máy tính của bạn. Thuật toán để thực hiện điều này được xác định bởi Tổ chức Phần Mềm Mở (www.opengroup.org).
Globally unique identifiers (GUIDs): GUIDs là một tiêu chuẩn của Microsoft mở rộng UUIDs.
High-low strategy: thường được gọi là persistent object identifier (OID) hoặc simply an object identifier (OID),
4. Làm sao chọn Key cho hiệu quả?
bạn nên tham khảo các bước sau
Tránh các "smart" keys. "smart" key là một trong những có chứa một hoặc nhiều phần nhỏ cung cấp ý nghĩa
Xem xét việc gán các natural keys cho các bảng look-up tables đơn giản. Look-up tables là các bảng mà bảng trong ngữ cảnh hiện tại chứ khóa ngoại tham chiếu tới các bảng đó.
Đánh Natural keys trên các "look up" tables không phải lúc nào cũng là tốt.
Các ứng dụng của bạn vẫn phải hỗ trợ "natural Key Search". Dù sử dụng surrogate key làm PK thì cũng đừng quên ứng dụng của bạn vẫn phải hỗ trợ tìm kiếm theo các natural candidate key.
Don't naturalize surrogate keys. đừng đối xử với các surrogate key như là các yếu tố natural
Bài viết được chỉnh sửa dựa trên bản dịch từ nguồn:http://www.agiledata.org/essays/keys.html
bởi sonnt5@fpt.edu.vn