2010-09-29 37 views
7

Tôi cho rằng mọi người sẽ gặp sự cố này một lần trong một thời gian: bạn có hai bảng có tự động sửa các khóa chính cần được hợp nhất. Có nhiều lý do chính đáng tại sao việc tự động sửa các khóa chính được sử dụng có lợi cho việc nói các khóa do ứng dụng tạo ra, nhưng việc hợp nhất với các bảng khác phải là một trong những hạn chế lớn nhất.Làm cách nào để hợp nhất các bảng bằng các khóa chính tự động?

Một số vấn đề phát sinh là các id trùng lặp và không đồng bộ hóa các khóa ngoại. Tôi muốn nghe cách tiếp cận của bạn để giải quyết vấn đề này. Tôi luôn gặp rắc rối, vì vậy tôi rất tò mò nếu có ai đó có một giải pháp chung nào đó.

- EDIT -

Để đối phó với các câu trả lời gợi ý để sử dụng guids hoặc phím không phải số khác, có những tình huống mà trước nó chỉ có vẻ là một ý tưởng tốt hơn để sử dụng các phím autonumber (và bạn hối tiếc sau này), hoặc bạn đang tiếp quản dự án của người khác, hoặc bạn nhận được một số cơ sở dữ liệu cũ mà bạn phải làm việc cùng. Vì vậy, tôi thực sự đang tìm kiếm một giải pháp mà bạn không có quyền kiểm soát thiết kế cơ sở dữ liệu nữa.

Trả lời

3

Hm, tôi rất mê mẩn về ý tưởng rằng tôi vừa đưa ra nhận xét về câu trả lời của AlexKuznetsov, vì vậy tôi sẽ trả lời toàn bộ câu hỏi đó.

Xem xét các bảng được đặt tên là table1 và table2, với id1 và id2 là tự động sửa các khóa chính. Chúng sẽ được hợp nhất thành table3 với id3 (một khóa chính không tự động).

Tại sao không:

  1. Hủy bỏ tất cả các ràng buộc khoá ngoại để table1 và table2
  2. Đối với tất cả các lĩnh vực chính nước ngoài đề cập đến table1, thực hiện một UPDATE table SET id1 = id1 * 2, và cho các lĩnh vực FK đề cập đến table2, thực hiện một UPDATE table SET id2 = (id2) * 2 + 1
  3. Fill table3 bằng cách thực hiện một INSERT INTO table3 SELECT id1 * 2 AS id3, ... FROM table1 UNION ALL SELECT id2 * 2 + 1 AS id3 FROM table2
  4. Tạo ràng buộc khoá ngoại mới để table3

Nó thậm chí có thể làm việc với 3 hoặc nhiều bảng, chỉ bằng cách sử dụng một số nhân cao hơn.

4

Giải pháp bao gồm:

  • Sử dụng GUID phím như chính thay vì một lĩnh vực nhận dạng đơn giản hơn. Rất có khả năng tránh trùng lặp, nhưng GUID khó sử dụng hơn và không chơi độc đáo với các chỉ mục nhóm.

  • Làm cho khóa chính thành khóa nhiều cột, cột thứ hai giải quyết các giá trị trùng lặp bằng cách xác định nguồn dữ liệu đã hợp nhất. Di động, hoạt động tốt hơn với các chỉ mục nhóm, nhưng các nhà phát triển ghét các khóa đa cột.

  • Sử dụng khóa tự nhiên thay cho bút giả.

  • Phân bổ các giá trị khóa chính mới cho một trong các bảng đã hợp nhất và gộp các thay đổi này vào bất kỳ hàng phụ thuộc nào. Điều này thay đổi một hoạt động hợp nhất thành một hoạt động ETL. Đây là giải pháp duy nhất bạn có thể sử dụng cho dữ liệu cũ, nếu bạn không thể thay đổi thiết kế cơ sở dữ liệu.

Tôi không chắc chắn có giải pháp một kích thước phù hợp. Chọn một trong số này dựa trên tình hình.

1

Một trong các cách tiếp cận chuẩn (nếu không phải là cách tiếp cận tiêu chuẩn), nơi bạn đang thiết kế cho một sự kiện như vậy, là sử dụng GUID cho khóa chính thay vì số nguyên - sáp nhập sau đó tương đối không đau. gặp phải sự trùng lặp.

Chặn thiết kế lại, tho ', tôi nghĩ bạn bị kẹt khi phải chèn vào bảng, chấp nhận rằng bạn sẽ nhận được khóa chính mới và đảm bảo rằng bạn duy trì ánh xạ từ ID cũ sang mới - sau đó chèn dữ liệu tham chiếu với FK được ánh xạ lại v.v. Nếu dữ liệu của bạn có "khóa doanh nghiệp" sẽ vẫn duy nhất sau khi chèn, điều này sẽ tiết kiệm được việc phải theo dõi ánh xạ.

1

Tôi chắc chắn bạn chỉ có hai bảng như vậy, bạn chỉ có thể có cả ID trong một bảng (0,2,4,6, ...) và ID lạ ở một bảng khác (1,3,5,7 , ...)

+0

Câu hỏi có ý nghĩa hơn theo một cách chung chung, không quá nhiều nơi bạn biết điều gì sẽ xảy ra trước (vì sau đó bạn có thể đã sử dụng guids). – Carvellis

+0

Có vẻ như một ý tưởng, để tính new_id = old_id * 2 cho bảng đầu tiên và new_id = (old_id * 2) + 1 cho bảng thứ hai. Nếu bạn làm điều này cho tất cả các bảng liên quan đến mọi thứ sẽ khớp lại và bạn có thể kích hoạt lại các ràng buộc khóa ngoài. – thomaspaulb

1

Giả sử bạn cũng có khóa tự nhiên trong các bảng được hợp nhất thì quá trình này không khó. Khóa tự nhiên được sử dụng để loại bỏ trùng lặp và gán lại một cách chính xác bất kỳ tham chiếu nào. Bạn có thể đổi tên các giá trị khóa thay thế bất kỳ lúc nào - đó là một trong những lợi thế chính của việc sử dụng đại diện tại địa điểm đầu tiên.

Vì vậy, tôi không thấy điều này là vấn đề với khóa thay thế - miễn là bạn luôn thực thi khóa tự nhiên (thực ra tôi thích thuật ngữ "khóa doanh nghiệp"). Nếu bạn chưa có khóa kinh doanh cho các bảng này, thì có lẽ bây giờ sẽ là thời điểm tốt để thiết kế lại để TẤT CẢ các khóa cần thiết được triển khai đúng cách.

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