20%

KHUYẾN MẠI

Giảm giá khi nâng cấp web năm 2020

Bài 3: Tạo ERD cho một dự án bất kỳ

Học laravel bài 3 dotrinh.com

Trong bài thứ 2 của seri, mình đã hướng dẫn bạn cách để dựng môi trường phát triển dự án Laravel. Bây giờ bạn đã có một website Laravel trên local của bạn. Việc tiếp theo chúng ta cần làm khi bắt đầu một dự án mới đó là phân tích các chức năng của web và tạo ERD dựa trên các chức năng đó. Việc tạo ERD là rất quan trọng, nó sẽ định hình cách lưu trữ data của bạn sau này. Vậy nên phải phân tích thật kỹ, không cần chuẩn 100% ngay từ ban đầu, nhưng nên làm chuẩn nhất có thể. Để sau này, có muốn sửa, thêm chức năng mới cũng chỉ cần sửa ít thôi. Giờ thì cùng mình đi qua các bước phân tích thiết kế database nhé.

Phân tích nghiệp vụ dự án

Đầu tiên chúng ta cần liệt kê ra các chức năng của dự án, để hiểu rõ những gì chúng ta sắp phải thực hiện. Khi đi làm thực tế thì những chức năng này phần lớn sẽ do khách hàng liệt kê cho bạn. Nhưng đây là dự án của chúng ta mà :)). Cùng mình xem xét một blog cơ bản sẽ cần những chức năng gì nhé:

  • Hệ thống quản trị viên
    • CRUD thành viên quản trị
    • Phân quyền cho quản trị viên
    • Đăng nhập vào hệ thống quản trị
    • CRUD Categories
    • CRUD bài viết
    • CRUD Comments
  • Hệ thống người dùng
    • Trang chủ
    • Trang chi tiết Category
    • Trang chi tiết bài viết
    • Chức năng Comment

Note: CRUD – Create – Read – Update – Delete, đó là 4 actions cơ bản và thông dụng nhất khi làm bất cứ thứ gì trong lập trình. Ví dụ đối với bài viết, có thể sẽ có nhiều chức năng phụ khác nhau, nhưng về bản chất, vẫn là CRUD cả. Ví dụ: Thêm bài viết vào database – Create, get 1 hoặc nhiều bài viết ra – Read, Sửa một bài viết nào đó – Update, Xóa bài viết đó – Delete. Từ “cờ rờ u đê” này bọn mình dùng rất nhiều khi làm việc, bạn có thể tham khảo :)))

Phân tích các chức năng CRUD thành viên quản trị viên

Nếu bạn đang thắc mắc chức năng này để làm gì thì mình có thể giải đáp cho bạn là thực tế, một blog có thể có một hoặc nhiều người quản lý. Thường blog cá nhân mà quy mô quá nhỏ thì chỉ 1 mình thôi, nhưng những hệ thống thông thường, hoặc những trang lớn sẽ có vài người đến rất nhiều người quản lý, nhiều tác giả viết bài,… nên chúng ta sẽ cần chức năng quản lý thành viên. Giờ thì phân tích một chút, chúng ta sẽ cần có các trang:

  • Danh sách thành viên
  • Thêm thành viên mới
  • Sửa thông tin thành viên
  • Xóa thành viên đó
  • Set quyền cho thành viên

Có chức năng quản lý thành viên thì sẽ cần có một table để lưu thông tin thành viên rồi. Ở đây chúng ta sẽ giả định một thành viên cần có những thông tin cơ bản sau đây:

  • id
  • Tên đăng nhâp(username)
  • Mật khẩu (password)
  • Họ và Tên thật (fullname)
  • email
  • Giới thiệu bản thân (introduction)
  • is_deleted
  • created_at
  • updated_at

Và vì có chức năng phân quyền cho thành viên, nên chúng ta sẽ có 1 table lưu các quyền, ở đây mình sẽ đặt tên table là roles:

  • id
  • name

Phân tích các chức năng CRUD Danh mục

Mỗi bài viết đều phải thuộc một danh mục nào đó, nên chúng ta sẽ tạo danh mục trước. Các chức năng cần có đó là:

  • Danh sách danh mục
  • Thêm danh mục
  • Sửa danh mục
  • xóa danh mục
  • Chi tiết danh mục (ở phía user, khi click vào một danh mục sẽ ra 1 trang chi tiết gồm mô tả danh mục, những bài post thuộc danh mục đó)

Từ những chức năng trên, chúng ta sẽ cần tạo một table “categories” để lưu thông tin danh mục. Bảng này gồm các fiend sau:

  • id
  • name
  • description
  • slug
  • is_deleted

Column slug bên trên được dùng để set đường dẫn URI cho category, phục vụ cho việc SEO, đường dẫn sẽ cũng sẽ thân thiện với người dùng hơn.

Phân tích các chức năng CRUD bài viết

  • Danh sách bài viết
  • Thêm bài viết mới
  • Chỉnh sửa bài viết
  • Xóa tạm bài viết
  • Danh sách bài viết bị xóa tạm
  • Xóa hoàn toàn bài viết
  • Chọn danh mục bài viết
  • Hiển thị thông tin tác giả ở cuối bài viết

Các chức năng cơ bản là như vậy, chúng ta sẽ tạo một posts table và xem nó cần có những gì nhé.

  • id
  • title
  • slug
  • content
  • thumbnail_image
  • is_deleted
  • created_at
  • updated_at

Phân tích chức năng bình luận

Ở blog của chúng ta sẽ cho phép người dùng để lại bình luận trong các bài viết. Vì thế sẽ cần có 1 table để lưu những bình luận này.

  • id
  • emaill
  • content
  • is_accept

Ở đây chúng ta sẽ để người dùng không cần đăng nhập vẫn có thể để lại comment, và không phải comment nào cũng được duyệt. Nên mình sẽ cần có column is_accept lưu trạng thái được duyệt hay chưa. Nếu giá trị là 0 => chưa duyệt, 1 => chấp thuận, 2 => reject. Và sau này, code sẽ chỉ cho hiển thị ngoài ra những comments đã duyệt.

Xem xét mối quan hệ giữa các Table

Trong phạm vi bài viết này, mình sẽ giới thiệu với bạn một số kiểu quan hệ cơ bản trong database sau. Đây là những kiểu thông dụng nhất, và có thể dùng trong phần lớn trường hợp thực tế. Cùng mình tìm hiểu nhé.

Quan hệ 1 – 1

Trong trường hợp của chúng ta thì không có quan hệ này, nhưng vì nó khá cơ bản và thông dụng, nên mình vẫn muốn giới thiệu với bạn. Ví dụ mình có 1 table là “thẻ căn cước”, thì mỗi người chỉ được phép có 1 thẻ căn cước, và một thẻ căn cước cũng chỉ tương ứng với một người. Dó đó chúng ta sẽ có quan hệ 1 – 1 giữa 2 bảng này. Vậy nên ở table “người dân”, mình sẽ thêm một column là “thẻ căn cước_id”, và ở table thẻ căn cước mình sẽ thêm 1 column là “người dân_id” để thuận tiện cho việc truy vấn thông tin.

Quan hệ 1 – nhiều (1 – n)

Giờ bắt đầu chú ý một chút về quan hệ giữa các table. Cùng phân tích một chút nhé. Quản trị viên thì có thể viết bài, nhưng mỗi bài sẽ chỉ có thể thuộc sở hữu của một QTV. Do đó chúng ta có mối quan hệ 1 – nhiều (1 – n). Vậy, để xác định ai là tác giả của bài viết, bạn cần thêm một column author_id vào posts table. Nó sẽ chứa id của tác giả để có thể truy vấn ra ai là tác giả khi cần thiết.

Tiếp đó, 1 comment chỉ có 1 người duyệt, nhưng 1 người có thể duyệt được nhiều comment. Để xác định được ai là người duyệt comment, bạn cần thêm 1 column user_id vào table comments để xác định người đã duyệt comment khi cần thiết.

Quan hệ nhiều – nhiều (n – n)

Tiếp đến là danh mục (category), một category có thể chứa nhiều bài viết, và ngược lại một bài viết cũng có thể thuộc nhiều category => đây là quan hệ nhiều – nhiều (n – n). Như vậy chúng ta sẽ cần tạo thêm một bảng trung gian để lưu những thông tin này.

Chúng ta có quy ước đặt tên table như sau, tên table sẽ là tên số nhiều của 2 table, nối với nhau bằng gạch dưới, theo thứ tự chữ cái alphabet => tên table sẽ là categories_posts. Trong table trung gian sẽ chứa 2 columns, đó là category_id và post_id. Sau này mỗi lần cần xem bài viết này thuộc những danh mục nào, hay 1 danh mục có những bài viết nào, chúng ta sẽ dựa vào table này để lấy thông tin.

Tương tự như vậy, một QTV có thể có nhiều roles, mà 1 role cũng có thể có nhiều người làm. Do đó, chúng ta có 1 table trung gian là roles_users, trong đó có 2 columns là role_id và user_id.

Cơ sở dữ liệu hoàn chỉnh

Từ những gì đã phân tích được bên trên, chúng ta sẽ có được 1 biểu đồ RDBMS như sau

Biểu đồ ERD blog cá nhân

Vừa rồi, mình vừa hướng dẫn bạn cách tạo ERD. Có rất nhiều công cụ hỗ trợ bạn tạo sơ đồ này, mình thì dùng Visual Paradigm, bạn nào không biết dùng gì thì có thể tham khảo. Bạn có thể tìm app khác thay thế nếu không ưng.

Đây là project nhỏ nên ERD khá đơn giản. Nhưng bạn yên tâm, kiến thức trong bài đủ để bạn có thể làm được phần lớn các dự án thông thường rồi. Có điều quy mô của lớn hơn, phức tạp hơn một chút thôi. Trong bài tiếp theo, chúng ta sẽ đi tới sử dụng migration để tạo những table này trong database mà không cần viết câu query.

Các bài viết không xem thì tiếc:

《Chia sẻ kiến thức này là người hào sảng》
---------------------------------------

Mình vừa đăng 1 video lên Youtube theo phong cách YOLO cách đây vài ngày trong lúc dịch COVID-19 vẫn kéo dài này.

Nếu có thời gian thì xem giúp mình có ổn không nhé? Bạn có thể nhận xét video trong Youtube cũng được nha!

LINK VIDEO: https://youtu.be/kQxUIpvplYc

Nếu bận thì lưu lại xem sau, mời bạn đọc bài khác

---------------------------------------

Thảo luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.

 
 
 
 
Facetime iPhone

Main Menu