Cơ sở dữ liệu hạn chế


8

Tôi biết trực giác đằng sau lập trình ràng buộc, vì vậy có thể nói tôi chưa bao giờ thực sự có kinh nghiệm lập trình bằng cách sử dụng một bộ giải ràng buộc. Mặc dù tôi nghĩ rằng đó là một tình huống khác nhau để có thể đạt được những gì chúng ta sẽ định nghĩa là dữ liệu nhất quán.

Bối cảnh:

Chúng tôi có một bộ quy tắc để thực hiện trên máy chủ ETL. Những quy tắc này là:

  • hành động trên một hàng.
  • hành động liên hàng, trong một hoặc các bảng khác nhau.
  • hành động theo cùng một cách giữa hai lần chạy (Cần duy trì cùng một ràng buộc đối với tất cả dữ liệu hoặc chỉ n lần chạy cuối cùng);

Trường hợp thứ ba khác với trường hợp thứ hai, vì nó giữ khi trường hợp thứ hai giữ nhưng với số lần chạy được xác định rõ. Nó có thể được áp dụng cho một lần chạy (một tệp) hoặc giữa (1 đến n (trước đó) hoặc trên Tất cả các tệp).

Về mặt kỹ thuật khi chúng tôi hình thành ETL, nó không có bộ nhớ giữa hai lần chạy: hai tệp (nhưng điều này cần được suy nghĩ lại)

Đối với việc áp dụng loại quy tắc thứ ba, ETL cần phải có bộ nhớ (tôi nghĩ rằng chúng tôi sẽ kết thúc dữ liệu sao lưu trong ETL); Hoặc bằng cách kiểm tra lại vô hạn (một Công việc) trên toàn bộ cơ sở dữ liệu sau một thời gian, do đó, dữ liệu kết thúc trong cơ sở dữ liệu không nhất thiết phải hoàn thành loại quy tắc thứ ba kịp thời.

Thí dụ:

Mặc dù chúng tôi có dữ liệu chảy liên tục, chúng tôi áp dụng các ràng buộc để có toàn bộ cơ sở dữ liệu bị ràng buộc, ngày hôm sau chúng tôi sẽ nhận được một bản sao lưu hoặc dữ liệu chỉnh sửa trong một tháng, đối với cửa sổ thời gian này, chúng tôi muốn có các ràng buộc chỉ thỏa mãn điều này chạy (cửa sổ thời gian này), mà không phải lo lắng về toàn bộ cơ sở dữ liệu, cho các lần chạy trong tương lai, tất cả dữ liệu sẽ bị hạn chế như trước mà không phải lo lắng về dữ liệu trong quá khứ. Bạn có thể tưởng tượng các quy tắc khác có thể phù hợp với logic tạm thời .

Hiện tại, chúng tôi chỉ có loại quy tắc đầu tiên được thực hiện. Cách tôi nghĩ là có một cơ sở dữ liệu rút gọn (dưới bất kỳ hình thức nào: MySQL, PostgreQuery, MongoDB ...) sao lưu tất cả Dữ liệu (chỉ các cột bị ràng buộc, có thể có giá trị băm) với các cờ đề cập đến tính nhất quán dựa trên trước đó loại quy tắc.

Câu hỏi:giải pháp / giải pháp thay thế thụ thai nào có thể làm giảm quá trình này không?

Để minh họa bằng ngôn ngữ lập trình Cook; Một ví dụ về một bộ quy tắc và các hành động sau:

run1 : WHEN tableA.ID == tableB.ID AND tableA.column1 > tableB.column2
       BACK-UP 
       FLAG tableA.rule1
AFTER run1 : LOG ('WARN')

run2 : WHEN tableA.column1 > 0
       DO NOT BACK-UP 
       FLAG tableA.rule2
AFTER run2 : LOG ('ERROR')

Ghi chú : Mặc dù về mặt lý thuyết, lập trình ràng buộc là một mô hình để giải quyết các vấn đề tổ hợp và trong thực tế có thể tăng tốc độ phát triển và thực hiện vấn đề; Tôi nghĩ rằng điều này khác với một vấn đề giải quyết ràng buộc; Vì mục đích đầu tiên không phải là để tối ưu hóa các ràng buộc trước khi giải quyết, có lẽ thậm chí không giới hạn các miền dữ liệu; Mối quan tâm chính của nó là áp dụng các quy tắc về nhận dữ liệu và thực hiện một số hành động cơ bản (Từ chối một dòng, Chấp nhận một dòng, Ghi nhật ký ...).

Tôi thực sự hy vọng đây không phải là một câu hỏi rất rộng và đây là nơi thích hợp.

Câu trả lời:


3

Tôi tìm thấy một giải pháp tinh vi để đạt được nhiều hơn những gì tôi nghĩ; nói về việc kiểm tra tính nhất quán dữ liệu. Rõ ràng đây là những gì chúng ta sẽ gọi là phân tích dữ liệu dựa trên thử nghiệm

Vì vậy, bây giờ với việc thực hiện này, chúng ta bị ràng buộc với Python và Pandas, nhưng may mắn thay, không chỉ. Chúng tôi thậm chí có thể kiểm tra tính nhất quán của dữ liệu trong các bảng MySQL, PostgreSQL ....

Điểm cộng tôi không nghĩ tới là chúng ta có thể suy ra các quy tắc dựa trên dữ liệu mẫu. Điều này có thể hữu ích cho việc thiết lập các quy tắc. Đây là lý do tại sao có tdda.constraints.verify_dftdda.constraints.discover_df.

Theo như tôi đọc, nó không đề xuất một giải pháp để kiểm tra tính nhất quán (yếu hơn) trên các tệp (n) cuối cùng. Một cái gì đó tôi nghĩ về việc chúng ta có thể gọi tính nhất quán của các tệp bó, điều đó chỉ đảm bảo sự hài lòng về quy tắc cho một số lần chạy (lần chạy cuối cùng) và không phải tất cả dữ liệu. Nó chỉ hoạt động trên các tập tin duy nhất, nó cần một hệ thống dây cấp cao hơn để có thể điều kiện (n) tập tin đến liên tiếp.

Để biết thêm: https://tdda.readthedocs.io/en/latest/constraint.html#module-tdda.constraint

assertCSVFilesCorrect Kiểm tra một tập hợp các tệp trong một thư mục, có thể tương tự đối với các tệp dữ liệu Pandas, v.v.

Từ tài liệu chính thức:

Thư viện tdda.constraint được sử dụng để khám phá các ràng buộc từ DataFrame (Pandas), viết chúng dưới dạng JSON và để xác minh rằng các bộ dữ liệu đáp ứng các ràng buộc trong tệp ràng buộc. Nó cũng hỗ trợ các bảng trong một loạt các cơ sở dữ liệu quan hệ. Ngoài ra còn có một tiện ích dòng lệnh để khám phá và xác minh các ràng buộc và phát hiện các bản ghi bị lỗi.

ps: Tôi vẫn đang mở cho các giải pháp khác, cho tôi biết vì tôi tưởng tượng đây là trường hợp sử dụng cho bất kỳ giải pháp ETL nào.

Tôi cũng mở một tiền thưởng để trả lời phong phú hơn nữa.


2

Bạn cũng có thể xem xét SQL transactions. Một giao dịch bao gồm một hoặc nhiều câu lệnh, được yêu cầu thực hiện bởi một người dùng hoặc một ứng dụng. Họ có thể đọc hoặc thậm chí sửa đổi dữ liệu trong cơ sở dữ liệu.

START TRANSACTION
Do DB stuff, check if constraints are violated
COMMIT

Bạn có thể chỉ định một số ràng buộc nhất định và sử dụng ROLLBACKnếu một trong những ràng buộc này bị vi phạm. Việc khôi phục có thể được mã hóa rõ ràng bởi nhà phát triển nhưng cũng có thể được ném ra khỏi hệ thống. (ví dụ: khi một lỗi xuất hiện không được nhà phát triển xử lý rõ ràng hoặc khi thực hiện kích hoạt). Giao dịch có thể không theo cách của nhau. Chúng phải được thực hiện theo cách cô lập. một số giao dịch đồng thời phải tạo ra kết quả tương tự trong dữ liệu giống như các giao dịch tương tự được thực hiện tuần tự, theo một số thứ tự (không xác định). Vì tất cả các DBMS hiện đại đều đảm bảo các thuộc tính ACID khi thực hiện giao dịch, nên việc thực hiện giao dịch là đáng tin cậy, do đó trạng thái cơ sở dữ liệu của bạn không nên có bất kỳ mâu thuẫn nào trong đó.

Không chắc đây có phải ý bạn không, nhưng có lẽ nó giúp.


Tôi đang tìm kiếm một cách trôi chảy hơn để hạn chế các luồng. trong trường hợp của tôi Giao dịch cần một địa ngục mã hóa để hạn chế thời gian đến của dữ liệu tôi đoán. Tuy nhiên, nó dường như là cách phổ biến nhất trong thế giới của SQL.
Curcuma_

1
Tôi hiểu rồi. Tôi chưa từng nghe về một cách lưu loát để hạn chế các luồng dữ liệu mới hơn theo cách lỏng lẻo hơn dữ liệu hiện có trong cơ sở dữ liệu của bạn. AFAIK (Ít nhất là trong các hệ thống SQL), bạn hãy quan tâm đến việc lập trình ràng buộc một lần, đảm bảo nó được thực hiện chính xác để bạn không phải lo lắng về điều đó một lần nữa. Sau đó, cơ sở dữ liệu đã nhất quán và khi dữ liệu mới được nhập vào các ràng buộc cơ sở dữ liệu của bạn sẽ tự động được kiểm tra và xử lý. Bạn sẽ không bao giờ phải kiểm tra tính nhất quán của toàn bộ cơ sở dữ liệu, khi n mục mới được nhập. Chỉ đối với n ràng buộc vật phẩm mới sẽ được kiểm tra
Psychotechnopath
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.