2009-03-13 32 views
8

Sau khi đọc qua nhiều câu hỏi ở đây về di chuyển và các phiên bản lược đồ DB, tôi đã tìm ra một lược đồ để cập nhật một cách an toàn lược đồ DB trong quá trình cập nhật của chúng tôi. Ý tưởng cơ bản là trong quá trình cập nhật, chúng tôi xuất cơ sở dữ liệu thành tệp, thả và tạo lại tất cả các bảng và sau đó nhập lại mọi thứ. Không có gì quá ưa thích hoặc mạo hiểm ở đó.Cách tốt nhất để từ chối một cột trong lược đồ cơ sở dữ liệu là gì?

Vấn đề là hệ thống này hơi "lan truyền", có nghĩa là chỉ an toàn để thêm cột hoặc bảng, vì việc xóa chúng sẽ gây ra sự cố khi nhập lại dữ liệu. Thông thường, tôi sẽ ổn khi bỏ qua các cột này, nhưng vấn đề là nhiều mục bị loại bỏ đã được cấu trúc lại, và sự hiện diện của các mục cũ trong mã sẽ khiến các lập trình viên khác nghĩ rằng chúng có thể sử dụng chúng.

Vì vậy, tôi muốn tìm cách để có thể đánh dấu cột hoặc bảng là không được chấp nhận. Trong trường hợp lý tưởng, các đối tượng không được chấp nhận sẽ được đánh dấu trong khi cập nhật lược đồ, nhưng trong bản cập nhật tiếp theo, tập lệnh sao lưu của chúng tôi sẽ không đơn giản là SELECT các đối tượng đã được đánh dấu theo cách này, cho phép chúng ta loại bỏ các phần này của lược đồ .

Tôi đã nhận thấy rằng MySQL (và có thể là các nền tảng DB khác, nhưng đây là nền tảng mà chúng tôi đang sử dụng) hỗ trợ thuộc tính COLUMN cho cả hai trường và bảng. Điều này sẽ hoàn hảo, ngoại trừ việc tôi không thể tìm ra cách sử dụng nó một cách có ý nghĩa. Làm thế nào tôi sẽ đi về viết một truy vấn SQL để có được tất cả các tên cột mà làm không chứa một chú thích phù hợp với văn bản có chứa từ "không dùng nữa"? Hoặc tôi đang nhìn vào vấn đề này tất cả sai, và thiếu một cách tốt hơn để làm điều này?

+0

Tôi không hiểu ý bạn là "nhiều mục đã loại bỏ thực sự được cấu trúc lại và sự hiện diện của các mục cũ trong mã khiến người lập trình khác nghĩ rằng họ có thể sử dụng chúng". –

+0

Tại sao bạn làm theo quy trình này thay vì duy trì và thực thi các tập lệnh sql delta? – cherouvim

Trả lời

6

Có thể bạn nên cấu trúc lại để sử dụng chế độ xem trên các bảng của mình, nơi các chế độ xem không bao giờ bao gồm các cột bị xáo trộn.

+1

+1: Giải pháp DB2 - chỉ sử dụng các khung nhìn trong các ứng dụng của bạn. –

3

"Deprecate" thường có nghĩa là (với tôi ít nhất) rằng nội dung nào đó được đánh dấu để xóa vào một số ngày trong tương lai, không được sử dụng bởi chức năng mới và sẽ bị xóa/thay đổi trong mã hiện tại.

Tôi không biết cách nào tốt để "đánh dấu" cột không dùng nữa, ngoài việc đổi tên, có khả năng phá vỡ mọi thứ! Ngay cả khi một cơ sở như vậy tồn tại, bao nhiêu sử dụng nó sẽ thực sự được?

Vì vậy, bạn có thực sự muốn từ chối hoặc xóa không? Từ nội dung câu hỏi của bạn, tôi đoán cái sau.

Tôi có cảm giác khó chịu rằng bạn có thể thuộc một trong những "nếu tôi muốn đến đó, tôi sẽ không bắt đầu từ đây" tình huống. Tuy nhiên, đây là một số ý kiến ​​cho rằng mùa xuân trong tâm trí:

  1. đọc Recipes for Continuous Database Integration mà dường như để giải quyết nhiều vấn đề khu vực của bạn

  2. Drop cột một cách rõ ràng. Trong MySQL 5.0 (và thậm chí sớm hơn?) Cơ sở tồn tại như một phần của DDL: xem cú pháp ALTER TABLE.

  3. Xem cách ActiveRecord::Migration hoạt động trong Ruby. Việc di chuyển có thể bao gồm chỉ thị "remove_column", điều này sẽ giải quyết vấn đề theo cách phù hợp với nền tảng. Nó chắc chắn làm việc với MySQL, từ kinh nghiệm cá nhân.

  4. Chạy tập lệnh chống lại việc xuất của bạn để xóa cột khỏi câu lệnh INSERT, cả danh sách cột và giá trị. Có lẽ khá khả thi nếu DB của bạn là khá nhỏ, mà tôi đoán nó phải là nếu bạn xuất khẩu và tái nhập khẩu nó như mô tả.

+1

"Ngay cả khi một cơ sở như vậy tồn tại, bao nhiêu sử dụng nó sẽ thực sự được?" Bạn có thể ngạc nhiên. Tôi đã chạy vào một tình huống mà tôi * không thể * đổi tên một cột vì phụ thuộc hiện có, nhưng tôi đang được yêu cầu đổi tên nó bởi khách hàng (người bây giờ muốn truy cập dữ liệu cho các ứng dụng khác). Vì vậy, tôi đã phải để lại một bản sao ở đó như một trình giữ chỗ để giữ cho mọi thứ không bị nổ tung. Sẽ rất tuyệt nếu cơ sở dữ liệu có thể đưa ra cảnh báo ở bất kỳ người dùng nào đã cố gắng 'SELECT' nó. Đó là trường hợp sử dụng chung cho ý tưởng không dùng nữa: bạn chưa thể xóa, nhưng bạn muốn bắt đầu loại bỏ nó. – jpmc26

+0

Bạn cảm thấy thế nào nếu thư viện yêu thích của bạn đột nhiên xóa một tính năng bạn sử dụng? Khái niệm tương tự cũng áp dụng ở đây. Đôi khi bạn không thể loại bỏ nó ngay lập tức mà không có một số lượng lớn công việc. Điều quan trọng là phải hiểu rằng một số vấn đề (không phải tất cả chúng) được giải quyết tốt hơn theo thời gian. –

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