Có phải thực tế kém để tổng hợp dữ liệu từ các bảng khác nhau thành một?


12

Lý lịch

Tôi viết rất nhiều báo cáo lớn và thường duy trì một hồ sơ sức khỏe lớn DB (viết SP, chức năng, công việc, v.v.). Lược đồ ban đầu và phần mềm sử dụng nó là của một nhà cung cấp khác, vì vậy tôi không thể thay đổi nhiều về cấu trúc. Có nhiều hồ sơ yêu cầu theo dõi như phòng thí nghiệm, quy trình, vắc-xin, v.v. và chúng nằm rải rác trên hàng chục bảng, nhiều bảng trong số đó bị cồng kềnh và bị lập chỉ mục kém (tôi đã có thể khắc phục điều này).

Vấn đề

Vấn đề là bởi vì chúng tôi có ít quyền kiểm soát DB và vì nó có thể thay đổi từ bất kỳ bản cập nhật hoặc bản vá nào, nên việc viết và duy trì các báo cáo này trở nên khó khăn và tẻ nhạt - đặc biệt là khi có số lượng chồng chéo lớn. Tất cả chỉ là một bản vá và tôi bị mắc kẹt khi viết lại phần lớn của một tá báo cáo. Ngoài ra, các truy vấn nhanh chóng bị xáo trộn và chậm chạp khi tham gia, chọn lồng nhau và áp dụng chồng chất.

Giải pháp của tôi"

Kế hoạch của tôi là viết tất cả các bản ghi này vào một bảng "bắt tất cả" và viết các trình kích hoạt trên các bảng gốc để duy trì các bản ghi trong bảng tổng hợp này. Tất nhiên tôi cần đảm bảo các kích hoạt của mình vẫn còn nguyên vẹn sau khi cập nhật, nhưng điều này sẽ dễ dàng hơn nhiều từ quan điểm bảo trì và chỉ cần tham khảo dữ liệu.

Bảng sẽ mỏng và dài, chỉ lưu trữ dữ liệu cần thiết, đại loại như thế này:

CREATE TABLE dbo.HCM_Event_Log (
    id INT IDENTITY,
    type_id INT NULL,
    orig_id VARCHAR(36) NULL,
    patient_id UNIQUEIDENTIFIER NOT NULL,
    visit_id UNIQUEIDENTIFIER NULL,
    lookup_id VARCHAR(50) NULL,
    status VARCHAR(15) NULL,
    ordered_datetime DATETIME NULL,
    completed_datetime DATETIME NULL,
    CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id)
)

Sau đó, tôi sẽ có các bảng quan hệ khác nhau cho những thứ như nhóm type_id và nhóm mục.

Tôi bắt đầu đoán thứ hai về ý tưởng này vì một vài trong số các bảng này được viết khá nhiều, các SP và báo cáo tôi sẽ viết cũng sẽ tham chiếu dữ liệu rất nhiều. Vì vậy, tôi lo ngại rằng bảng này sẽ trở thành một cơn ác mộng về hiệu suất và khóa kỷ lục với rất nhiều I / O.

Câu hỏi của tôi

Là một ý tưởng xấu hay tốt? Tôi nhận thấy mọi tình huống đều khác nhau trong SQL Server (2008 r2 Phiên bản tiêu chuẩn BTW) và quy tắc "đôi khi", nhưng tôi thực sự chỉ tìm kiếm lời khuyên chung.

Tôi bắt đầu xem xét sử dụng một nhà môi giới dịch vụ, nhưng tôi chỉ thực hiện các cập nhật / chèn đơn giản ( Xem phần thay thế cho câu trả lời được chấp nhận ). Dữ liệu trong nhiều trường hợp cần phải là thời gian thực, vì vậy sử dụng DB dự phòng sẽ không thực sự hiệu quả. Hiệu suất đã là một vấn đề đối với chúng tôi, nhưng hầu hết đó là liên quan đến phần cứng sẽ sớm được giải quyết.


1
Bạn có thể thực thi mất điện theo kế hoạch? Nếu không một trong những cập nhật đó có thể xóa sạch trình kích hoạt và bạn sẽ không cập nhật tổng hợp của mình có thể dẫn đến dữ liệu xấu.
Erik

Bạn đang xem xét đưa tất cả thông tin về phòng thí nghiệm, về các quy trình cũng như về vắc-xin và về bệnh nhân vào một bảng? Ý kiến ​​tồi. Bạn có thể sử dụng lược đồ sao, nếu phù hợp với loại truy vấn bạn đang chạy.
Michael Green

1
Bạn đã xem xét việc tạo ra một số quan điểm được lập chỉ mục? Chúng sẽ đặt một lớp logic giữa mã của bạn và của nhà cung cấp để bạn chỉ có thể cập nhật chế độ xem nếu nhà cung cấp thay đổi những thứ bên dưới. Ngoài ra, các chế độ xem được lập chỉ mục sẽ được chuẩn bị trước cho bạn và cung cấp hiệu suất đọc tốt. Một trong những cân nhắc lớn hơn trong việc này là nó tải bao nhiêu cho các hoạt động ghi của các bảng cơ sở dữ liệu của nhà cung cấp. Tuy nhiên, đây có thể sẽ là một giải pháp sạch hơn và dễ bảo trì hơn so với sử dụng các kích hoạt, v.v.
Micah Nikkel 14/8/2015

Xin lỗi cho những người trả lời muộn, cảm ơn đã phản hồi. @Erik - Có, chúng tôi đã lên kế hoạch cập nhật và tôi kiểm tra để đảm bảo tất cả các thay đổi trước đây của tôi vẫn được thực hiện thông qua một loạt các kịch bản danh sách kiểm tra mà tôi chạy, vì vậy sẽ không có bất ngờ nào ở đó và tôi sẽ giữ TẠO các kịch bản cho tất cả các kích hoạt.
jreed121

@MichaelGreen - Tôi sẽ xem xét một lược đồ sao, nhưng tôi tò mò tại sao bạn nghĩ rằng có tất cả dữ liệu đó trong một bảng là một ý tưởng tồi? Môi trường ứng dụng hoàn toàn bị cô lập trên VPN, dù sao nó cũng không thể truy cập được ngoài mạng. Nếu có gì đó không ổn với cái bàn, thì đó không phải là ngày tận thế bởi vì tôi có thể viết mọi thứ lại cho nó. Bảng sẽ không được sử dụng cho dữ liệu quan trọng, hoặc ít nhất nó sẽ không phải là nơi duy nhất, cũng không phải là nơi chính mà dữ liệu được lưu trữ.
jreed121

Câu trả lời:


8

Nếu tôi hiểu bạn chính xác,

  • bạn có một hệ thống bên thứ ba lớn,
  • bạn không có nhiều quyền kiểm soát nó,
  • bạn tạo các báo cáo phức tạp đọc dữ liệu trực tiếp từ cơ sở dữ liệu của bên thứ ba này,
  • truy vấn của bạn phụ thuộc vào cấu trúc bên trong của cơ sở dữ liệu của bên thứ ba.

Tôi sẽ tiếp cận nó như thế này:

  • Thiết lập cơ sở dữ liệu riêng của tôi, nơi tôi có toàn quyền kiểm soát.
  • Thiết lập quy trình đồng bộ đọc dữ liệu từ các bảng và cột có liên quan từ cơ sở dữ liệu của bên thứ ba và chèn / cập nhật vào của tôi.
  • Phát triển các báo cáo phức tạp của tôi dựa trên cấu trúc ổn định của cơ sở dữ liệu của tôi.

Trong trường hợp này, bạn có thể tinh chỉnh cấu trúc và các chỉ mục của cơ sở dữ liệu của mình để cải thiện hiệu suất của các báo cáo, mà không ảnh hưởng đến hệ thống của bên thứ ba. Trừ khi cấu trúc dữ liệu ban đầu thay đổi đáng kể, logic của các truy vấn cho báo cáo của bạn sẽ không thay đổi nếu cơ sở dữ liệu của bên thứ ba thay đổi. Bạn sẽ chỉ phải điều chỉnh quá trình đồng bộ hóa.

Quá trình đồng bộ hóa thực sự là quá trình chuyển đổi - bạn chuyển đổi dữ liệu từ cơ sở dữ liệu của bên thứ ba sang cấu trúc mà bạn cần. Một phần của quy trình chuyển đổi này có thể khắc phục mọi sự cố chuẩn hóa mà cơ sở dữ liệu bên thứ ba ban đầu có thể có. Chỉ phần này của hệ thống phải biết và phụ thuộc vào cấu trúc bên trong của hệ thống bên thứ ba. Báo cáo chính và truy vấn chính của bạn sẽ chỉ phụ thuộc vào cơ sở dữ liệu của bạn.

Vì vậy, điểm chính là - tách biệt và giới hạn một phần hệ thống của bạn phụ thuộc vào nội bộ của hệ thống bên thứ ba.

cập nhật

Về yêu cầu thời gian thực. BTW, tôi luôn nghĩ rằng định nghĩa về "thời gian thực" là "thời gian phản hồi được đảm bảo", chứ không phải "một số thời gian phản hồi nhỏ". Nó phụ thuộc vào ứng dụng của bạn, tất nhiên. Trong thực tế của tôi là đủ nếu tôi đồng bộ hóa hai cơ sở dữ liệu trong vòng một phút sau khi thay đổi được phát hiện. Nếu người dùng nhìn thấy một báo cáo trên màn hình và một số thay đổi dữ liệu cơ bản, báo cáo phải được chạy lại bằng cách nào đó để phản ánh sự thay đổi này. Bạn có thể thăm dò các thay đổi hoặc nghe một số sự kiện / tin nhắn, vẫn phải thực hiện lại truy vấn báo cáo để hiển thị các thay đổi mới nhất.

Bạn đã có ý định viết các trình kích hoạt để nắm bắt các thay đổi trong các bảng gốc và ghi các thay đổi này vào một bảng chung. Vì vậy, hãy nắm bắt các thay đổi như bạn dự định, nhưng viết chúng vào các bảng được chuẩn hóa đúng cách, không phải là một bảng duy nhất.

Vì vậy, đây là trường hợp cực đoan - chuyển đổi cấu trúc dữ liệu của bên thứ ba thành cấu trúc dữ liệu nội bộ của bạn được thực hiện trong các kích hoạt kích hoạt INSERT/UPDATE/DELETEcác bảng của bên thứ ba. Nó có thể là khó khăn. Mã kích hoạt sẽ phụ thuộc vào cấu trúc bên trong của cả hai hệ thống. Nếu chuyển đổi là không tầm thường, nó có thể trì hoãn ban đầu INSERT/UPDATE/DELETEđến điểm thất bại của họ. Nếu có lỗi trong trình kích hoạt của bạn, nó có thể ảnh hưởng đến giao dịch ban đầu đến điểm thất bại của họ. Nếu hệ thống của bên thứ ba thay đổi, nó có thể phá vỡ trình kích hoạt của bạn, điều này sẽ khiến các giao dịch của hệ thống bên thứ ba không thành công.

Trường hợp cực ít. Để làm cho mã kích hoạt của bạn đơn giản hơn và ít bị lỗi hơn, hãy viết tất cả các thay đổi đã nắm bắt vào một số bảng phân tầng / kiểm toán / khác biệt, đặt một số cờ / gửi thông báo rằng có các thay đổi đang chờ xử lý và khởi chạy quy trình chuyển đổi chính sẽ diễn ra thông qua các bảng trung gian và thực hiện chuyển đổi. Điều chính ở đây là quá trình chuyển đổi nặng có thể xảy ra ngoài phạm vi của giao dịch ban đầu.

Nhìn thoáng qua, nó trông khá giống đề xuất ban đầu của bạn trong câu hỏi. Nhưng, sự khác biệt là: các bảng bắt giữ chỉ giữ dữ liệu tạm thời; lượng dữ liệu nhỏ - chỉ những gì đã thay đổi; nó không phải là một bảng duy nhất; cuối cùng, dữ liệu sẽ được lưu trữ trong các bảng cố định được chuẩn hóa riêng biệt mà bạn có toàn quyền kiểm soát, độc lập với hệ thống của bên thứ ba và bạn có thể điều chỉnh các truy vấn của mình.


Nếu bạn đi theo lộ trình chuyển hàng loạt, chúng tôi đã thành công với Theo dõi thay đổi (và Thay đổi dữ liệu, tùy thuộc vào nhu cầu của bạn) với số lượng giao dịch khá cao (100 nghìn mỗi ngày). Nó đơn giản hơn việc thực hiện các bảng phân tầng / kiểm toán / khác biệt của riêng bạn và có thể được triển khai mà không cần thay đổi hoặc kích hoạt mã ứng dụng.
Michael Green

Có thể là trình kích hoạt hoặc CDC, cách duy nhất bạn thực sự đến gần với thời gian thực là phát trực tuyến hoặc xếp hàng. Xếp hàng dựa trên là một sự thỏa hiệp tốt cho độ trễ và hiệu quả chi phí. Thời gian của bạn sẽ được dành cho các phương pháp để xử lý hàng đợi nhanh hơn. khiến phần lớn công việc không đồng bộ khỏi ứng dụng và giảm tải cho các giao dịch của người dùng. Trước đây, tôi đã từng làm điều này chống lại Allscripts Sunrise EMR với một dịch vụ xử lý hàng đợi với một số cuộc gọi C # song song. độ trễ điển hình cho dữ liệu mới được xử lý và có sẵn trong kho là phụ 30 giây
Brad D

Tôi có thể đã nói "thời gian thực", tôi không quá quan tâm đến mili giây hoặc thậm chí 5 giây, nhưng tôi có nhiều truy vấn mà nhân viên của chúng tôi dựa vào để điều khiển công việc. Nếu khách hàng đã làm gì đó với họ (thủ tục, tiêm chủng, v.v.), chúng tôi sẽ cần chứng minh điều đó trong một thời gian ngắn. Các chuyển đổi là tầm thường và / hoặc thậm chí không chuyển đổi. Tôi không quá quan tâm đến việc thay đổi bảng nhà cung cấp, vì họ không thay đổi thường xuyên và dù sao tôi cũng phải làm điều đó, nhưng tôi nghĩ rằng việc cập nhật / tạo lại một trình kích hoạt dễ dàng hơn hàng tá báo cáo / truy vấn / SP. Tôi chạy kiểm tra sau mỗi lần cập nhật.
jreed121

@ jreed121, tôi cũng nghĩ rằng nó dễ dàng hơn để kích hoạt cập nhật (s) so với báo cáo. Bạn có thể sẽ có một kích hoạt trên mỗi bảng nguồn để nắm bắt các thay đổi, vì vậy nó có thể là nhiều hơn một kích hoạt. Tuy nhiên, đừng cố viết tất cả những thay đổi đã nắm bắt này vào một bảng không chuẩn hóa lớn. Viết chúng vào một tập hợp các bảng được chuẩn hóa đúng. Báo cáo của bạn nên dựa trên các bảng được chuẩn hóa này mà bạn kiểm soát và không nên phụ thuộc vào các bảng gốc có thể thay đổi.
Vladimir Baranov

3

Bằng mọi cách, hãy đặt nó vào một tập hợp các bảng được tiêu chuẩn hóa để bạn có thể điều chỉnh giai đoạn nhập thay vì phải thay đổi (các) báo cáo và truy vấn phức tạp. Nhưng dữ liệu vẫn phải được chuẩn hóa, sẽ yêu cầu nhiều bảng (nhưng có chỉ mục tốt).

Như những người khác đã đề cập, không sử dụng kích hoạt, đồng bộ hóa theo đợt.

Đừng lo lắng về nhiều liên kết, khi dữ liệu được chuẩn hóa và lập chỉ mục đúng, những dữ liệu này không thêm bất kỳ gánh nặng chi phí hoặc quản lý đáng kể nào.

Thời gian để chuẩn hóa thành một thứ giống như kho dữ liệu là khi bạn cần có thể thực hiện nhiều loại truy vấn khác nhau trên dữ liệu mà bạn không thể dự đoán. Nó có nhược điểm riêng và chi phí chung và nên được sử dụng khi thích hợp, không phải là điều cần thiết.


3

Tôi đã làm việc với một tình huống rất giống như thế này trong một công ty sản xuất 24x7 và cuối cùng quyết định sử dụng bản sao giao dịch. Có thể cấu hình DDL được sao chép để bạn có thể đẩy ra bất cứ điều gì các bản vá thay đổi cho người đăng ký. Rõ ràng có những ưu và nhược điểm đối với mọi thứ và bạn cần cân nhắc chúng để xác định những gì bạn có thể hỗ trợ chống lại những gì tốt nhất cho công ty.

Về mặt tích cực:

  1. "Thời gian thực" chỉ giới hạn ở hiệu suất cam kết mạng và giao dịch trên thuê bao. Theo kinh nghiệm của tôi với hệ thống TPS cao vừa phải, chúng tôi đã được sao chép trong vòng chưa đến 10 giây dữ liệu "thời gian thực".
  2. Tách khối lượng công việc. Bạn hiện đang chạy một khối lượng công việc hỗn hợp trên một máy chủ. Nếu bạn có thể tách rời hai mối quan tâm này, thì bạn có thể nhận được lợi ích hiệu suất trên cả hai hệ thống đã loại bỏ một khối lượng công việc khỏi phương trình
  3. Điều khiển. Bạn sẽ có thể thực hiện lập chỉ mục / thống kê / sửa đổi bảo trì cho phù hợp với khối lượng công việc báo cáo của bạn.

Có những khuyết điểm:

  1. Giá cả. Giấy phép khác và nhiều phần cứng hơn (ảo, hoặc cách khác).
  2. Nhân rộng. Nó hoạt động rất tốt khi nó được thiết lập đúng, nhưng có thể gặp rắc rối khi đi đến điểm đó.
  3. Bảo trì. Nếu bạn thực hiện bất kỳ thay đổi nghiêm trọng nào đối với các cấu trúc (ví dụ: bỏ chỉ mục), chúng sẽ quay lại khi ảnh chụp nhanh được áp dụng (sau khi ấn phẩm đã thay đổi hoặc khi bài viết đã thay đổi).

2

Kế hoạch của tôi là viết tất cả các bản ghi này vào một bảng "bắt tất cả" và viết các trình kích hoạt trên các bảng gốc để duy trì các bản ghi trong bảng tổng hợp này.

Kích hoạt có rất nhiều vấn đề bạn nên tránh chúng:

  • Một lỗi trong trình kích hoạt có thể khiến giao dịch gốc bị hủy bỏ
  • Kích hoạt xử lý chính xác các hoạt động nhiều hàng khó viết
  • Các trình kích hoạt có thể gây nhầm lẫn cho các ứng dụng khách bằng cách sửa đổi các hàng được trả về (ví dụ: một trình kích hoạt ghi đè số lượng các hàng bị ảnh hưởng)
  • Khi một kích hoạt kích hoạt khác, kết quả rất khó dự đoán

Một lựa chọn tốt hơn là một công việc sao chép dữ liệu định kỳ sang một bảng mới. Báo cáo của bạn có thể chạy bản sao. Một công việc sao chép các hàng rất dễ viết và duy trì, và không có rủi ro rằng nó sẽ ảnh hưởng đến hoạt động của ứng dụng bên thứ ba.


1. Các kích hoạt sẽ đơn giản, do đó, các lỗi ném sẽ là tối thiểu nếu tồn tại. 2. Bản thân trình kích hoạt sẽ không xử lý nhiều hàng (IE một hàng được cập nhật trong bảng với trình kích hoạt sẽ không khiến nhiều hàng được cập nhật ở nơi khác), nhưng nhiều hàng có thể được chèn / cập nhật / xóa cùng một lúc trong nguồn bảng - đây là những gì bạn có ý nghĩa? 3. điều này không thể được xử lý với NOCOUNT? 4. Sẽ không có bất kỳ kích hoạt nào trên bảng đích và tôi có thể đảm bảo tương tự cho những cái khác.
jreed121

Giống như bạn nói, về mặt lý thuyết có thể làm cho kích hoạt hoạt động. Đó chỉ là trong thực tế họ không bao giờ làm.
Andomar
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.