01/10/2018, 08:32

Giải pháp nào để cập nhật sự thay đổi của Database mỗi khi phát hành phiên bản mới của phần mềm?

Chào tất cả mọi người mình có 1 vấn đề mà đang gặp bế tắc chưa tìm ra giải pháp nào để giải quyết. Rất mong được mọi người chỉ giáo giúp để mình được khai sáng thêm.

Mình có tự mày mò làm 1 phần mềm quản lý nhỏ cho nội bộ phục vụ khoảng hơn 50 đơn vị. Phần mềm của mình thì vừa viết vừa hoàn thiện dần dần. Mình viết bằng C# và database SQLSERVER theo kiểu client server và dùng độc lập ở các đơn vị ( mỗi đơn vị chạy một server SQL ).
Ban đầu thì cũng nhỏ thôi nhưng theo thời gian và các yêu cầu nghiệp vụ, chính sách thay đổi liên tục nên đến bây giờ Database đã phình ra khoảng 1000 store procedure và 200 table. Sau mỗi lần thay đổi mình lại phải cập nhật lại: thêm trường thêm table, sửa hoặc thêm store procedure,triger sau đó đóng gói thành bản nâng cấp.
Vấn đề của mình là:

  • Với mỗi lần nâng cấp nhỏ thì mình viết script sql để kiểm tra sự thay đổi của Database để cập nhật.
  • Còn mỗi lần nâng cấp lớn mình tại phải backup DB của từng đơn vị về rồi dùng tính năng schema compare của VS 2010 để cập nhật DB.
    Với yêu cầu ngày cành ra tăng và các đơn vị lại ngày cành thêm mới thì mình thực sự đang bị quá tải trong việc hỗ trợ và nâng cấp theo cách mình làm ở trên.
    Mình thì từ trước tới giờ chưa từng làm ở bên ngoài các công ty phần mềm nào vì vậy cũng không biết cách mà các công ty họ giải quyết vấn đề này như thế nào. VD: Misa, SAP, Fast, Kiot Việt… họ sử dụng giải pháp nào để cập nhật DB mỗi khi phát hành phiên bản mới.
    Hôm nay mạn phép gửi câu hỏi này rất mong mọi người chia sẻ giúp mình biết giải pháp khi gặp vấn đề tương tự như mình. Mình xin cảm ơn rất nhiều.
Tao Không Ngu. viết 10:34 ngày 01/10/2018

Hi Nguyen Viet Phuong.
1 Bạn cần phân tích yêu cầu kỹ để thiết kế DB tốt.
2 Các vấn đề tương thích có thể giải quyết bởi một lớp đệm đọc dữ liệu.thay vì đọc trực tiếp từ DB lên.

Nguyen Viet Phuong viết 10:44 ngày 01/10/2018

Hi cảm ơn anh Phong_Ky_Vo

  • Đồng ý với anh là DB của em đang thiết kế rất không tốt. Thời gian tới chắc em phải ngồi lại để tối ưu lại cái DB.
    Yêu cầu thì luôn có thường xuyên, ví dụ bụp 1 cái hôm nay phòng ban này có yêu cầu làm 1 chức năng này, báo cáo kia thì em lại viết thêm chức năng, nhưng 1 thời gian sau chức năng viết thêm lại cần liên quan đến chức năng đã viết trước đó -> Thế là DB thiết kế cứ loạn hết cả lên không kiểm soát được.
  • Anh có thể nói kỹ hơn về cách “giải quyết bởi một lớp đệm đọc dữ liệu” của anh ko ? hay cho em xin 1 keyword, hay link opensource để em search google nghiên cứu, thực sự là mông lung không biết tìm từ đâu. Cũng đã có lần em mày mò dịch ngược thử file exe, dll của misa xem họ làm thế nào nhưng code họ dùng Dotfuscator ( chống dịch ngược ) nên cũng chẳng thu được gì.
Tao Không Ngu. viết 10:38 ngày 01/10/2018

Hi Nguyen Viet Phuong.
Cái này mình cũng chỉ xem qua va không nghiên cứu kỹ lắm.
1 Bạn thiết kế database có khả năng mở rộng khi bổ sung mới chức năng thì thay vì phải thiết kế lại DB hay cập nhật lại toàn bộ các bảng thì chỉ cần bổ sung thêm bảng mà thôi. Bạn có thể tham khảo
“design pattern” Tất cả đều đề cập đến việc làm thế nào để có thể mở rộng một cách dễ ràng.
2 Cái lớp đệm đó mình tham khảo bên https://web.liferay.com/web/raymond.auge/blog/-/blogs/api-backward-compatibility
Đại khái là thay vì bạn truy cập trực tiếp vào DB thì thay vào đó truy cập vào một lớp dữ liệu xây dựng trên DB. Khi yêu cầu thêm chức năng thì bạn hạn chế thay đổi DB cũ mà thay vào đó thêm các bảng mới và viết lại lớp dữ liệu.
3 Học phân tích thiết kế CSDL.

Reoteu Ray viết 10:47 ngày 01/10/2018

ủa mình nghĩ là design pattern chỉ áp dụng để thiết kế phần mềm thôi chứ , nó còn áp dụng để thiết kế cả csdl à … vì mình thấy trong phát triển phần mềm nó mới có khả năng viết sao cho các module ít phụ thuộc với nhau nhất , chứ còn trong csdl thì các bảng sẽ có ràng buộc cứng với nhau làm sao mà áp dung design pattern được nhỉ…

cdxf viết 10:37 ngày 01/10/2018

Thật ra thì có nhiều nguyên tắc của OOP vẫn áp dụng tốt với DB thôi

Bài liên quan
0