Các bạn có thể đọc part 1 tại: https://techmaster.vn/posts/35149/today-i-learned-mot-so-pattern-trong-thiet-ke-database

Bài viết chia sẻ một số kiến thức học được qua cuốn sách: Beginning Database Design Solutions của tác giả Rod Stephens

Bài viết trước đề cập đến các pattern: Many-to-Many Associations, Multiple-Object AssociationsRepeated Attribute Associations. Bài viết này đề cập đến một pattern khác, đó là Reflexive Associations

Reflexive Associations chỉ sự liên kết giữa 1 đối tượng và 1 đối tượng cùng kiểu. Ví dụ: 

- một Người cưới một Người khác

- một Đội bóng thi đấu với một Đội bóng khác

- một Nhân viên chịu sự quản lý của một Nhân viên khác

- một Nhân viên quản lý nhiều Nhân viên khác

... 

Reflexive Associations có những kiểu sau:

1. One-to-One Reflexive Associations

Được dùng để mô tả quan hệ 1-1 giữa 2 đối tượng cùng kiểu.

Ví dụ:

- một Người cưới một Người khác

- một Đội bóng thi đấu với một Đội bóng khác

...

Giả sử chúng ta muốn thiết kế một database theo dõi kết quả thi đấu giữa các đội bóng, các bước cần tiến hành là:

- Dựng bảng Team mô tả Đội bóng. Chú ý cần có cột ID

- Dựng bảng MatchResult theo dõi kết quả thi đấu giữa các đội. Bảng này có 2 cột: team_id_1 và team_id_2, cả hai cột này đều link đến cột ID ở bảng Team. Ngoài ra còn có các cột score, winner, datetime: Cột winner tất nhiên cũng sẽ link đến cột ID của bảng Team, còn cột datetime để phân biệt giữa các trận đấu của cùng một cặp đối thủ

One-to-One Reflexive Associations
One-to-One Reflexive Associations

2. One-to-Many Reflexive Associations

Được dùng để mô tả quan hệ 1-nhiều giữa 2 đối tượng cùng kiểu

Ví dụ:

- một Nhân viên được quản lý bởi một Giám đốc, còn một Giám đốc quản lý nhiều Nhân viên

Để xây dựng database cho ví dụ trên, các bước cần tiến hành là:

- Dựng bảng Employee mô tả nhân viên. Chú ý phải có cột ID

- Trong bảng Employee cần có một cột is_managed_by. Cột này sẽ link trực tiếp đến cột ID tại bảng Employee luôn

One-to-Many Reflexive Associations
One-to-Many Reflexive Associations

Dữ liệu mẫu sẽ có dạng như sau:

Theo dữ liệu mẫu trên thì 3 nhân viên Paul Pogba, Nemanja Matic và Ander Herrera được quản lý bới nhân viên có id = 4, tức là được quản lý bởi Michael Carrick. Có thể thuộc tính position của Michael Carrick là assistant manager, nhưng về bản chất thì Michael Carrick vẫn là một nhân viên (employee)

3. Hierarchical data

Được dùng để mô tả quan hệ mang tính thứ bậc, ví dụ như:

- các cấp bậc trong một công ty

- cấu trúc file-thư mục trong một hệ thống máy tính

Thực ra thì quan hệ Hierarchical bản chất chính là quan hệ One-to-Many Reflexive Associations. Chúng ta có thể dựa trên dữ liệu mẫu ở phần 2 và mở rộng ra như sau:

Nếu như ở cấu trúc One-to-Many Reflexive Associations, các nhân viên Paul Pogba, Nemanja Matic và Ander Herrera chịu sự quản lý của Michael Carrick còn bản thân Michael Carrick thì không bị ai quản lý thì ở cấu trúc Hierarchical này:

- Michael Carrick cùng với Kierra McKenna và Mike Phelan sẽ chịu sự quản lý của nhân viên có id = 7 là Ole Gunnar Solskjaer

- đến lượt Ole Gunnar Solskjaer sẽ chịu sự quản lý của nhân viên có id = 8 là Ed Woodward

- đến lượt Ed Woodward sẽ chịu sự quản lý của nhân viên có id = 9 là Malcom Glazer

- đến lượt Malcom Glazer thì nhân viên này không chịu sự quản lý của ai cả. Đây là trùm cuối :D

4. Network data

Được dùng để mô tả quan hệ giữa các đối tượng trong một hệ thống mạng

Ví dụ:

- hệ thống mạng máy tính

- hệ thống đường phố

Giả sử chúng ta cần thiết kế database cho một hệ thống mạng máy tính gồm nhiều node mạng kết nối với nhau thông qua các đường link, các bước cần tiến hành là:

- Dựng bảng Node mô tả các node trong hệ thống mạng. Chú ý bảng cần có cột ID

- Dựng bảng Link mô tả kết nối giữa các node trong hệ thống mạng. Bảng Link có 2 cột: from_node_id và to_node_id, 2 cột này sẽ trỏ đến cột ID ở bảng Node

Database design for network data