Cơ sở dữ liệu với thành viên có thể nâng cấp

Chào mọi người, mình đang thiết 1 cơ sở dữ liệu cho trang web thương mại điện tử giống như Tiki, lazada, …
Trong website này, sẽ có 2 role chính: Customer và Merchant
Khi user đăng ký vào website, tài khoản của user đó được set mặc định là Customer, các tài khoản này chỉ được mua sản phẩm được đăng trên website.
Khi user muốn bán sản phẩm của họ, họ có thể nâng cấp tài khoản lên từ Customer thành Merchant, loại tài khoản này vừa có thể mua, vừa có thể bán sản phẩm mình đăng lên. (Khi một người đăng ký trực tiếp tài khoản Merchant, hệ thống vẫn sẽ tạo ra 1 tài khoản Customer rồi nâng cấp lên thành Merchant)
Hiện tại thì mình có 2 cách thiết kế CSDL, nhưng không biết có hợp lý ko, mong mọi người giúp mình.
Cách 1: Sẽ có 1 bảng account, bảng “Customer” và bảng “Merchant” sẽ có khóa ngoại tới khóa chính của bảng account (Mình định để “Customer” và “Merchant” là thực thể yếu nhưng không chắc vì mình chưa bao giờ xài, có nên thêm các khóa chính cho bảng “Customer” và “Merchant” không ?)

table account(
account_id primary key,
username,
password,
isMerchant bool,
)
table Customer(
 account_id foreign key account(account_id),
 name,
 gender,
 phone,
 email,
 ...etc
)
table Merchant(
 account_id foreign key account(account_id),
 shop's name,
...etc
)

Cách 2: Cũng giống như cách 1, nhưng ở đây “Merchant” sẽ lấy khóa ngoại từ Customer thay vì Account (Customer sẽ có thêm 1 khóa chính).

table account(
account_id primary key,
username,
password,
isMerchant bool,
)
table Customer(
customer_id primary key,
account_id foreign key account(account_id),
name,
gender,
phone,
email,
...etc
)
table Merchant(
customer_id foreign key customer(customer_id),
shop's name,
...etc
)

Nếu bắt buộc phải tích hợp 1 account có thể đóng 2 vai trò thì cách 1 của bạn sẽ hợp lý hơn. Với cách 2 thì nếu người dùng chỉ muốn làm Merchant thì sao? Merchant muốn đăng nhập phải lấy thông tin account qua bảng Customer, như vậy là không hợp lý và không tối ưu. Nếu tách được 2 mỗi account chỉ có 1 vai trò là tốt nhất.

1 Like

Vì cái này mình mô phỏng lấy yêu cầu từ doanh nghiệp nên bắt buộc phải tích hợp 2 vai trò trong 1 account, nếu mà theo cách 1 thì mình có nên các kháo chính vào 2 bản ko nhỉ ?

Vậy thì bạn có thể gộp luôn thành còn 2 bảng:

  • users: username, password, isMerchant bool, name, gender,…
  • merchant: customer_id foreign key users(id)
    Làm như vậy thì việc thao tác của bạn cũng sẽ dễ dàng hơn.
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?