2008-09-19 38 views
14

Bị kẹt với lược đồ cơ sở dữ liệu cũ không còn phản ánh mô hình dữ liệu của bạn là cơn ác mộng của mỗi nhà phát triển. Tuy nhiên, với tất cả các cuộc nói chuyện về mã refactoring cho bảo trì tôi đã không nghe nói nhiều về refactoring lược đồ cơ sở dữ liệu lỗi thời.Mẹo về tái cấu trúc lược đồ cơ sở dữ liệu lỗi thời

Một số mẹo về cách chuyển sang giản đồ tốt hơn mà không vi phạm tất cả mã dựa trên lược đồ cũ? Tôi sẽ đề xuất một vấn đề cụ thể mà tôi phải minh họa cho quan điểm của mình nhưng cảm thấy tự do để đưa ra lời khuyên về các kỹ thuật khác đã được chứng minh hữu ích - những khả năng đó cũng có thể hữu ích.


dụ của tôi:

Công ty của tôi nhận được và tàu sản phẩm. Bây giờ một biên nhận sản phẩm và một lô hàng sản phẩm có một số dữ liệu rất khác nhau liên kết với họ để các nhà thiết kế cơ sở dữ liệu ban đầu tạo ra một bảng riêng biệt cho biên nhận và cho các lô hàng.

Trong một năm làm việc với hệ thống này, tôi đã nhận ra rằng lược đồ hiện tại không có ý nghĩa gì. Sau khi tất cả, cả một biên nhận và một lô hàng về cơ bản là một giao dịch, mỗi người liên quan đến việc thay đổi số lượng của một sản phẩm, ở tim chỉ có dấu +/- là khác nhau. Thật vậy, chúng tôi thường xuyên cần phải tìm tổng số tiền mà sản phẩm đã thay đổi trong một khoảng thời gian, một vấn đề mà thiết kế này là hết sức khó khăn.

Rõ ràng thiết kế phù hợp sẽ là có một bảng Giao dịch đơn với Id là khóa ngoại của bảng ReceiptInfo hoặc bảng ShipmentInfo. Thật không may, lược đồ sai đã được sản xuất trong một số năm và có hàng trăm thủ tục được lưu trữ, và hàng ngàn dòng mã được viết ra khỏi nó. Làm thế nào sau đó tôi có thể chuyển đổi lược đồ để hoạt động chính xác?

Trả lời

5

Dưới đây là một danh mục toàn bộ tái cấu trúc cơ sở dữ liệu:

http://databaserefactoring.com/

+0

Có điều gì cụ thể cho MySQL không. Tất cả những gì tôi thấy có biểu đồ ... không có hướng dẫn thực tế về cách loại bỏ bảng tra cứu. –

+0

Chủ yếu là RDBMS-thuyết bất khả tri. Bản thân cuốn sách chứa các chỉ dẫn thực tế. Có một phép tái cấu trúc cho * thêm * một bảng tra cứu, không thể nhìn thấy một để loại bỏ nó :) http://databaserefactoring.com/AddLookupTable.html –

0

Mọi truy cập dữ liệu có bị giới hạn trong các thủ tục được lưu trữ không? Nếu không, nhiệm vụ có thể gần như không thể. Nếu vậy, bạn chỉ cần đảm bảo rằng các tập lệnh di chuyển dữ liệu của bạn làm việc tốt khi chuyển từ cũ sang lược đồ mới, và sau đó đảm bảo các thủ tục lưu trữ của bạn tôn trọng đầu vào và đầu ra.

Hy vọng rằng không ai trong số họ có các truy vấn "chọn *". Nếu có, hãy sử dụng 'sp_help tablename' để nhận danh sách đầy đủ các cột, sao chép và thay thế mỗi * bằng danh sách cột đầy đủ, chỉ để đảm bảo bạn không phá vỡ mã khách hàng.

Tôi khuyên bạn nên thực hiện thay đổi dần dần và thực hiện nhiều thử nghiệm tích hợp. Thật khó để thực hiện một sửa đổi đáng kể mà không cần giới thiệu một vài lỗi.

+0

Không tôn trọng Eric, nhưng điều này không đưa ra bất kỳ lời khuyên thực tế nào ngắn gọn khi nói 'làm điều đó một cách cẩn thận'. Trong trường hợp của tôi, 99% quyền truy cập thực sự là với SP nhưng có hàng chục nghìn dòng mã PL/SQL, bạn có thể đề xuất một số đọc về di chuyển dữ liệu không? –

+0

Tôi đoán tôi không thấy điểm đọc về tái cấu trúc, mỗi lần. Tôi nghĩ chiến lược đúng đắn là thiết kế lược đồ chính xác (để đọc lên thiết kế cơ sở dữ liệu sẽ tốt hơn), và sau đó khi đã xong, hãy tìm hiểu cách di chuyển dữ liệu và viết lại các procs. Đó là tất cả từng trường hợp. Ví dụ: –

0

Điều đầu tiên là tạo giản đồ bảng. Tôi đã làm điều đó cho một cơ sở dữ liệu cũ bằng cách sử dụng kiến ​​trúc sư doanh nghiệp. Bạn có thể chọn DB và nó sẽ tạo cho bạn mọi bảng/trường. Sau đó, bạn sẽ cần chia nhỏ mọi thứ trong các danh mục. Exemple tất cả các bạn nhận và tàu sản phẩm với nhau, công cụ của khách hàng trong một thể loại khác. Khi mọi thứ đã rõ ràng, bạn sẽ có thể vào trường refactor bằng cách tạo bảng mới, releashionship mới và các trường mới. Tất nhiên, điều này sẽ cần rất nhiều thay đổi nếu tất cả được truy cập mà không cần lưu trữ thủ tục.

2

Đó là một điều rất khó khăn để làm việc xung quanh; Một vài tùy chọn nhanh sau khi cấu trúc lại cơ sở dữ liệu là:

  • Tạo chế độ xem khớp với giản đồ gốc nhưng kéo từ lược đồ mới; Bạn có thể cần trình kích hoạt ở đây để mọi cập nhật cho các chế độ xem có thể được xử lý.
  • Tạo giản đồ mới và đặt trình kích hoạt ở mỗi bên để duy trì mặt khác.
  • 1

    Thủ tục và chế độ xem được lưu trữ là bạn của bạn tại đây. Ngay cả khi hệ thống không sử dụng chúng, hãy thay đổi nó để sử dụng chúng, sau đó refactor cơ sở dữ liệu bên dưới.

    Biên lai và lô hàng của bạn sau đó trở thành chế độ xem.

    Hãy coi chừng, nhận và giao hàng thực sự là hai con thú rất khác nhau trong hầu hết các hệ thống mà tôi đã làm việc cùng. Biên nhận được liên kết với các nhà cung cấp, trong khi các lô hàng được liên kết với khách hàng (hoặc khách hàng/tàu đến các địa điểm). Ở cấp khoảng không quảng cáo, chúng thường được biểu thị giống nhau.

    +0

    Cảm ơn lời khuyên, thực sự chúng là những con thú rất khác nhau, nhưng vì phần lớn các nhiệm vụ chúng tôi thực hiện với hệ thống là hàng tồn kho liên quan nên không có ý nghĩa gì khi chúng ta xử lý chúng như vậy –

    3

    This book (Refactoring Databases) đã là Thiên Chúa gửi cho tôi khi giao dịch với các lược đồ cơ sở dữ liệu cũ, kể cả khi tôi phải giải quyết hầu như cùng một vấn đề chính xác cho cơ sở dữ liệu khoảng không quảng cáo của chúng tôi.

    Ngoài ra, có một hệ thống để theo dõi các thay đổi đối với giản đồ cơ sở dữ liệu (giống như một loạt các kịch bản lệnh thay đổi được lưu trữ trong kho lưu trữ nguồn) giúp vô cùng phụ thuộc vào các phụ thuộc mã-đến-cơ sở dữ liệu.

    0

    Tôi không nghĩ rằng rõ ràng là id của bảng giao dịch phải là khóa ngoài hoặc là ReceiptInfo hoặc một ShipmentInfo. Hãy suy nghĩ theo cách khác. Trong một mô hình hướng đối tượng, bạn nên có một bảng giao dịch và một ReceiptInfo hoặc một ShipmentInfo nên có khóa ngoài cho bảng giao dịch. Nếu bạn may mắn, sẽ chỉ có 1 hoặc 2 điểm trong mã mà các bản ghi mới trong ReceiptInfo hoặc một ShipmentInfo được thực hiện. Ở đó bạn nên thêm mã nơi bạn thêm một mục trong bảng giao dịch và sau đó tạo mục nhập trong ReceiptInfo hoặc ShipmentInfo với khóa ngoài để giao dịch.

    +0

    Tôi nghĩ chúng ta có cùng một điều trong tâm trí. Bạn nói đúng về thuật ngữ tôi sẽ sửa bài của tôi. –

    0

    Đôi khi bạn có thể tạo bảng mới có cấu trúc tốt hơn và sau đó tạo chế độ xem với tên của bảng cũ nhưng dựa trên dữ liệu trong bảng mới. Bằng cách đó, bạn mã không phá vỡ trong khi bạn bắt đầu di chuyển đến một cấu trúc tốt hơn. Hãy cẩn thận với thsi mặc dù đôi khi bạn di chuyển từ một bảng phi quan hệ đến một cấu trúc quan hệ mà bạn có nhiều bản ghi trong khi mã sẽ chỉ mong đợi một. Điều này là đúng nếu bạn có các nhà phát triển sử dụng các truy vấn con.

    Sau đó, khi mọi thứ được thay đổi, nó sẽ di chuyển khỏi các chế độ xem đến bảng thực. Cuối cùng bạn có thể thả các khung nhìn. Điều này ít nhất cho phép bạn làm việc từng bước để giữ cho mọi thứ hoạt động khi bạn di chuyển nội dung, nhưng bắt đầu khắc phục mọi thứ để sử dụng một thiết kế tốt hơn.

    Các vấn đề liên quan