2010-10-18 29 views
5

Chúng tôi có một giao diện đơn giản để gắn thẻ một câu hỏi cụLàm thế nào để bạn kết hợp các thẻ trên một hệ thống đã tồn tại

(e.g. entry has 1..many tags and each tag entry has a foriegn key pointer back to the entry table) 

1. What is the current production version of the jdk? (Tags: jdk6 jdk-6 jdk java) 
2. In what version was java.util.spi package introduced? (Tags: jdk-6, jdk7, jdk5) 
3. Which version of java is going to be released soon? (Tags: jdk-6, jdk7, jdk8) 

Chúng tôi muốn hợp nhất tất cả các thẻ có tên là "jdk6" để jdk6. Làm thế nào để chúng ta đạt được điều này trong một hệ thống đang gần sản xuất nhưng chứa dữ liệu hữu ích.

Trong [1] jdk-6 cần được xóa, vì jdk6 đã có mặt. Trong [2,3] jdk-6 cần được đổi tên thành "jdk6".

Tôi cần loại tập lệnh nào để di chuyển dữ liệu này một cách hiệu quả.

EDIT

create table entry (id, question, ...) 
create table entry_tag (id, entry_id, tag) 
+1

Bạn có thể giải thích cấu trúc bảng của mình không? – JNK

+0

thêm giản đồ theo EDIT – Sam

Trả lời

0

đầu tiên tôi sẽ tạo ra một bảng mới với một danh sách các ID entry có chứa một trong các thẻ 'jdk6' hoặc 'jdk6'.

Sau đó, tôi sẽ xóa tất cả các bản ghi thẻ cho các thẻ 'jdk6' và 'jdk-6'.

Và sau đó tôi sẽ thêm lại chúng bằng cách sử dụng bảng được tạo lúc bắt đầu.

+0

Điều này thực sự sẽ vặn với hệ số phân nhóm của chỉ mục trên entry_tag.entry_id –

2

tôi sẽ làm như sau:

  1. Cập nhật "xấu" thẻ với một tốt (UPDATE TagTable SET Tag = 'jdk6' WHERE tag = 'jdk-6')

  2. Tháo thẻ trùng lặp (nơi entry_id và Tag đều giống nhau). Chính xác như thế nào bạn làm điều này sẽ phụ thuộc vào việc bạn có một khóa duy nhất riêng biệt trên bàn hay không, nhưng một google nhanh chóng sẽ cung cấp cho bạn một loạt các phương pháp làm việc trong các hoàn cảnh khác nhau.

  3. Giả sử bạn có bảng Danh sách thẻ với danh sách tất cả các thẻ khả dụng, hãy xóa jdk-6 khỏi nó (DELETE FROM TagsList WHERE Tag = 'jdk-6').

+0

+1 nhưng toàn bộ điểm gắn thẻ thường không chỉ định toàn bộ miền trước. Điều này dẫn đến: tại sao lại sửa nó nếu nó chỉ có thể thoát ra khỏi 'loại' một lần nữa? –

0
/* Step 1 - Delete where both tags exist */ 
delete from et1 
    from entry_tag et1 
     inner join entry_tag et2 
      on et1.entry_id = et2.entry_id 
       and et2.tag = 'jdk6' 
    where et1.tag = 'jdk-6' 

/* Step 2 - Update remaining tags */ 
update entry_tag 
    set tag = 'jdk6' 
    where tag = 'jdk-6' 
Các vấn đề liên quan