Thiết kế cơ sở dữ liệu tốt nhất cho tình huống này là gì?


8

Tôi đang làm việc để xây dựng một ứng dụng kinh doanh cho công ty của mình và đấu tranh để chọn thiết kế cơ sở dữ liệu phù hợp nhất cho một tình huống cụ thể. Hãy nói rằng tôi có các thực thể sau đây:

Sự chấp thuận

  • Tôi
  • Trạng thái
  • ...

Phê duyệt

  • Tôi
  • Phê duyệt
  • Bình luận

Đặt hàng

  • Tôi
  • ...

Hóa đơn

  • Tôi
  • ...

Rõ ràng có thể có nhiều loại phê duyệt và nhiều đối tượng yêu cầu phê duyệt. Điều gì sẽ là thích hợp nhất trong các tùy chọn sau đây để thiết kế các bảng:

LỰA CHỌN 1

Có một bảng phê duyệt với các khóa ngoại null:

Phê duyệt

  • Id PK
  • Trạng thái
  • Đặt hàng FK NULL
  • Hóa đơn FK NULL

Phê duyệt

  • Id PK
  • Phê duyệt FK
  • Bình luận

Trong trường hợp này tôi sẽ phải thêm một cột cho mọi đối tượng cần phê duyệt

LỰA CHỌN 2

Có bảng phê duyệt cha mẹ với các trường chung và bảng con cho mỗi đối tượng cần phê duyệt:

Phê duyệt

  • Id PK
  • Trạng thái

Phê duyệt

  • Id PK
  • Phê duyệt FK
  • Bình luận

Đơn đặt hàng

  • Phê duyệt PK FK
  • Đặt hàng FK

Hóa đơn

  • Phê duyệt PK FK
  • Hóa đơn FK

TÙY CHỌN 3

Có một bảng phê duyệt cho từng đối tượng:

Đơn đặt hàng

  • Id PK
  • Đặt hàng FK
  • Trạng thái

Đặt hàng ứng dụng

  • Id PK
  • Đặt hàngApprovalId FK
  • Bình luận

Hóa đơn

  • Id PK
  • Hóa đơn FK
  • Trạng thái

InvoiceApprovalComments

  • Id PK
  • InvoiceApprovalId FK
  • Bình luận

Tôi biết đây là tất cả các giải pháp hợp lệ, nhưng tôi không thể quyết định lựa chọn nào là tốt nhất để thêm các loại phê duyệt khác nhau trong tương lai. Có suy nghĩ gì không?

Câu trả lời:


10

Một nguyên tắc nhỏ mà tôi sử dụng, đó là thiết kế cơ sở dữ liệu tồi phải thay đổi bảng để thay đổi mã hoặc một tính năng mới nếu có thể được lên kế hoạch trong tương lai.

Điều đó nói rằng, tôi sẽ sử dụng một biến thể của Tùy chọn 1

Approvals
    Id PK
    ApprovalTypeID FK
    Status


ApprovalComments
    ID PK
    ApprovalId FK
    Comment

ApprovalTypes
    ID PK
    Name

Bây giờ khi thêm các loại đối tượng mới cần phê duyệt, bạn chỉ cần chèn một hàng vào ApprovalTypes thay vì thay đổi bảng để thêm một cột.


Mối quan hệ id với một đơn đặt hàng / hóa đơn cụ thể sẽ đi đến đâu trong tình huống này? Giả sử một đơn đặt hàng yêu cầu "phê duyệt tín dụng", vì vậy loại phê duyệt sẽ là tín dụng, nhưng làm thế nào để liên kết với đơn hàng (hoặc bất kỳ thực thể nào)? Ngoài ra, các cột bổ sung sẽ đi đâu chỉ dành riêng cho phê duyệt tín dụng?
user1384977

Điều đó thêm một chút phức tạp. Bạn có thể có bảng CreditApprovalDetails. Nếu bạn cần liên kết phê duyệt với các đơn đặt hàng, bạn sẽ cần một bảng tham gia, trừ khi đó là 1: 1. Tuy nhiên, không có sự hiểu biết đầy đủ về ứng dụng của bạn, tôi không thể đưa ra một gợi ý có hiểu biết.
trả lời

2

Đó là tính chính xác của DB của bạn và những thứ bạn muốn lưu trữ, ví dụ: bạn chỉ có thể tạo sự chấp thuận như một mối quan hệ duy nhất và tạo mối quan hệ 1-1 giữa phê duyệt và phê duyệt, vì vậy bạn sẽ bỏ qua việc tạo thêm một bảng ... Tôi đã thấy nó theo cách này:

Cardinality:
Approval N ---- 1 Approval_comment.
Approval 1 ----- N Order
Order N ----- 1 Invoice

nhập mô tả hình ảnh ở đây


1

Tôi bỏ phiếu cho sự thay thế đầu tiên. Nếu bạn thêm phê duyệt cần thiết vào một mục, bạn có thể thay đổi hành vi của các mục đó, vì vậy việc thêm một cột không phải là vấn đề lớn. Ngoài ra, đó là cách tốt nhất để sử dụng tham gia trong các truy vấn.

Bảng thứ hai có các bảng bổ sung vô dụng, có thể gợi ý rằng nhiều hơn một phê duyệt có thể thuộc về một mục.

Bảng thứ ba chứa rất nhiều bảng dự phòng và có thể là mã dự phòng để xử lý chúng.


1

Nếu bạn phải quyết định giữa một trong ba lựa chọn của mình, tôi tin rằng Lựa chọn 2 là tốt nhất. @sreimer là chính xác rằng phải thay đổi cấu trúc bảng của bạn cho các điểm sự kiện có thể thấy trước ở thiết kế xấu. Có OrderID và InvoiceID trong bảng Phê duyệt, như tôi thấy, rất gần với một nhóm lặp lại qua các cột và vi phạm tinh thần, nếu không phải là chữ cái, ở dạng bình thường đầu tiên.

Tôi sẽ xem xét việc thêm một cột Phê duyệt vào mỗi bảng cần phê duyệt. Nếu giá trị là null, nó đã không được phê duyệt. Nếu đó không phải là một lựa chọn, tôi nghĩ rằng @sreimer là thiết kế phù hợp - một số giải thích có thể giúp cải thiện điều đó.


1

Tôi muốn đề nghị bạn chỉ có một bảng =>

Sự chấp thuận

Tôi

trạng thái

bình luận

Và có sự chấp thuận được lưu trữ trong bảng inovice hoặc Order. Bằng cách này, bạn không phải thêm cột cho từng đối tượng và có ít bảng hơn để duy trì. Và nếu tôi phải chọn giữa tùy chọn mà bạn đã cung cấp, tôi sẽ chọn tùy chọn 2 và hợp nhất nhận xét phê duyệt vào bảng phê duyệt.


0

Bạn có thể thử một cái gì đó như thế này:

Phê duyệt
---------
  TÔI
  trạng thái
  Phê duyệt tên
  (những thứ khác)

Đơn đặt hàng
------
  TÔI
  (những thứ khác)

Hóa đơn
--------
  TÔI
  (những thứ khác)

Phê duyệt_objects
----------------
  TÔI
  Approval_id (FK - đề cập đến bảng phê duyệt)
  Phê duyệt_object_id (FK - có thể tham khảo ID của Hóa đơn, Đơn đặt hàng, v.v ...)
  Phê duyệt_object_type_id (FK đề cập đến Phê duyệt_object_types)

Phê duyệt_object_types
---------------------
  TÔI
  Tên

Các approved_objectsbảng sẽ cho bạn biết chính đi mà đối tượng đã được phê duyệt. Các đối tượng đã được phê duyệt có thể ở invoices, ordershoặc cái gì khác. Bạn xác định bảng nào cần tra cứu dựa trên approved_object_type_id. Điều này sẽ linh hoạt, nhưng có thể làm cho báo cáo một chút khó khăn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.