Polymorphic table

A/c cho em hỏi khi thiết kế DB thì việc thêm 1 table mới và 1 column cái nào sẽ dễ hơn. Ví dụ: e đang có bảng: quà tặng sản phẩm và quà tặng discount
Product_Gift (id, product_id, quantity)
Discount_Gift (id, percent)
… nhiều loại gift khác nữa
Thì e có nên gọp lại thành 1 bảng Gift có tất cả các column của từng loại gift trên và phân biệt chúng qua column gift_type ? hay nên tách thành các bảng các loại gift riêng như trên? Ưu và nhược điểm của 2 cách làm này là ntn ạ?

1 Like
  1. Cái này thì tùy vào business và tình hinh hiện tại của product.
  2. Với bài tập thì bạn cứ thử cả 2 để trải nghiệm thôi
4 Likes

Vấn đề của cậu ở đây là product gift và discount gift không liên quan gì tới nhau cả, theo như mô tả của cậu :smile:

Thực ra nó có liên quan tới nhau. Discount gift theo như mô tả của cậu, có vẻ nó giống như coupon (một dạng benefit cho người mua có thể sử dụng để giảm giá cho một order). Trong khi, product gift có vẻ giống như một dạng campaign mua một đồ vật được tặng một đồ vật khác. Do đó, tớ sẽ gọi nó là các loại campaign.
2 loại benefit này có một số điểm chung:

  • Có thời điểm bắt đầu/kết thúc campaign.
  • Có trạng thái của campaign: bị xóa hay chưa bị xóa, bị cancel hay ở trạng thái bình thường. Thường cậu không xóa cứng benefit, vì nó liên quan tới tính toán tiền bạc, nên cậu chắc chắn sẽ cần trạng thái này để đánh dấu (cái này được gọi là xóa mềm, hay xóa logic, vì bản ghi vẫn còn ở đó, nhưng trong application logic thì bản ghi đó không tồn tại).
  • Phân biệt với nhau bằng kiểu campaign.

Khi đó, cậu sẽ để các thông tin trên ở chung bảng, còn các thông tin chi tiết cho từng loại campaign sẽ được tách thành bảng riêng (như cậu mô tả ở Product_Gift và Discount_Gift). Như vậy, DB của cậu sẽ được chuẩn hóa, tức là cậu sẽ không có sự dư thừa dữ liệu.
Cậu cũng nên học qua 1 khóa học về database normalization và data modeling. Nó sẽ giúp cậu rất nhiều đấy! :smile:

Thêm một table mới và thêm 1 column mới không có nhiều sự khác biệt trong độ phức tạp đâu. Vấn đề sẽ chủ yếu xảy ra ở trên application của cậu, khi code mới sẽ phải cần gọi tới column/table này, trong khi code cũ không có. Điều đó dẫn tới backward-compatibility issue, khi cậu sẽ gặp khó khăn khi revert lại code. Tuy nhiên, việc thêm bảng mới nhìn chung sẽ dễ dàng hơn chút, do cậu không phải sửa một loạt các entity, DAO trong application của cậu, mà cậu chỉ tạo ra một entity/DAO riêng cho bảng mới này.
Tớ không nghĩ vấn đề này liên quan tới vấn đề thực sự của cậu ha :sweat_smile:

Hope it helps!

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?