Tôi đang xây dựng cơ sở dữ liệu kiểm kê theo dõi thiết bị máy tính và các thiết bị phần cứng khác. Tại một số thời điểm trong cuộc sống của bất kỳ thiết bị nào, thiết bị đã ngừng hoạt động và được lưu trữ. Sau khi được lưu trữ, nó cần được theo dõi vì nó được xóa khỏi dịch vụ và được xử lý đúng cách. Ban đầu tôi đã thiết kế cơ chế lưu trữ bằng cách sử dụng một bản sao chính xác của cơ sở dữ liệu đang hoạt động để nhận dữ liệu của nó bằng cách sử dụng trình kích hoạt xóa khỏi cơ sở dữ liệu hoạt động. Cơ sở dữ liệu lưu trữ bao gồm các bản sao của tất cả các bảng có liên quan vì vì một số bản ghi liên quan đến nước ngoài không còn phù hợp, người dùng không thể truy cập được để sử dụng với các thiết bị mới, nhưng được yêu cầu về tính toàn vẹn tham chiếu và truy vấn với các bảng lưu trữ. Hãy nhớ rằng khái niệm lưu trữ ở đây không chỉ là để giữ một lịch sử hoặc nhật ký. Các kho lưu trữ là một phần của quá trình kinh doanh,
ERD bên dưới sử dụng Inventory.DeviceType
bảng làm ví dụ trong đó tất cả các mục nhập và cập nhật được sao chép vào Archive.DeviceType
bảng. Khi người dùng không còn có thể nhập các bản ghi hàng tồn kho của một loại thiết bị nhất định, nó sẽ bị xóa khỏi Inventory.DeviceType
bảng, nhưng vẫn còn trong bảng lưu trữ. Mẫu này được sử dụng trên tất cả các bảng để đảm bảo tài liệu lưu trữ tham chiếu đến dữ liệu hợp lệ, do đó là bản sao của tất cả các bảng.
Ví dụ về bảng hoạt động (Các bảng liên quan khác bị bỏ qua)
Ví dụ về bảng lưu trữ (Các bảng liên quan khác bị bỏ qua)
Vấn đề
Tôi đang cố gắng tìm hiểu làm thế nào tôi sẽ truy vấn cơ sở dữ liệu nếu tôi không biết thiết bị đang hoạt động hay được lưu trữ? Ví dụ: nếu người dùng có số sê-ri và muốn tìm hiểu thông tin về thiết bị và họ không biết liệu nó có được lưu trữ hay không.
Cách 1: Tạo chế độ xem dựa trên tất cả liên minh?
Tùy chọn 2: Truy vấn cơ sở dữ liệu đang hoạt động và sau đó truy vấn kho lưu trữ nếu truy vấn đầu tiên không trả về gì?
Câu chuyện tiếp tục ...
Một cộng sự đề nghị tôi loại bỏ cơ sở dữ liệu lưu trữ và sử dụng sơ đồ xóa mềm. Tôi đã xây dựng một mô hình bằng cách sử dụng ý tưởng này, và sau đó bắt đầu gặp phải một loạt các vấn đề khác.
Dưới đây là các bảng tương tự bằng cách sử dụng lược đồ xóa mềm.
Ví dụ xóa mềm
Với thiết lập này, các thiết bị được lưu trữ bằng cách đặt IsArchived
trường thành true và nhập một ArchivedDate
. Tôi có thể truy vấn bất kỳ thiết bị nào một cách dễ dàng cho dù thiết bị đang hoạt động hay được lưu trữ. (Vui lòng bỏ qua IsActive
trường này, vì trường hợp này được sử dụng cho một khái niệm không liên quan).
Hãy chú ý đến bảng phụ của Điện thoại, nơi tôi phải truyền một chỉ mục của cờ DeviceID và IsArchiving vì số điện thoại phải là duy nhất cho các thiết bị hoạt động. Tôi phải làm điều này với các bảng phụ khác. Tôi không biết đây là một thiết kế tốt hay xấu.
Phần này thực sự làm tôi bối rối ...
Các thực tiễn tốt nhất để xử lý xóa mềm trong đó các giá trị khóa ngoài có thể được đánh dấu là đã xóa. Điều duy nhất tôi có thể nghĩ đến là tạo một thói quen tìm kiếm tất cả các bản ghi liên quan đến dữ liệu đã xóa và tạo một báo cáo để người dùng giải quyết các khác biệt. Ví dụ: nếu một bảng vị trí có liên quan đến bảng thiết bị và một số vị trí bị xóa mềm, thì các thiết bị tham chiếu đến các vị trí không còn tồn tại và phải được di chuyển.
Nhân tiện, tôi đang sử dụng MS SQL Server 2008 R2 và tôi dự định sử dụng Entity Framework 4 trong ứng dụng của mình. Tôi đánh giá khả năng duy trì cơ sở dữ liệu trên hiệu suất.
Cảm ơn bạn đã đọc.