2010-09-17 39 views
6

Tôi đang viết một số mã để tìm chi tiết khách hàng trùng lặp trong cơ sở dữ liệu. Tôi sẽ sử dụng khoảng cách Levenshtein.Cách lưu trữ các mối quan hệ hai chiều

Tuy nhiên, tôi không chắc chắn cách lưu trữ các mối quan hệ. Tôi sử dụng cơ sở dữ liệu tất cả các thời gian nhưng chưa bao giờ đi qua tình trạng này và tự hỏi nếu ai đó có thể chỉ cho tôi đi đúng hướng.

Điều làm tôi bối rối là cách lưu trữ bản chất hai chiều của mối quan hệ.

Tôi đã bắt đầu đưa một số ví dụ dưới đây, nhưng tự hỏi nếu có một thực hành tốt nhất để lưu trữ kiểu dữ liệu này,

Ví dụ dữ liệu

id, địa chỉ

001, 5 Main Street
002, 5 Main St.
003, 5 Main Str
004, 6 High Street
005, 7 Low đường
006, 7 Low St

Đề xuất 1

customer_id1, customer_id2, relationship_strength
001, 002, 0,74
001, 003, 0,77
002, 003, 0,76 005, 006, 0.77

Không hài lòng với cách tiếp cận này vì nó sắp xếp một mối quan hệ một chiều giữa quyền sở hữu omer_id1 đến customer_id2. Trừ khi tất nhiên tôi bao gồm tất cả các mối quan hệ cả hai cách, nhưng điều đó sẽ tăng gấp đôi số lượng thời gian xử lý và kích thước của các bảng.

ví dụ sẽ cần phải bao gồm: 002, 001, 0,74

Đề xuất 2

customer_id, grouping_id
001, 1
002, 1
003, 1
005, 2
006, 2

Trả lời

6

Điều chúng tôi có ở đây là biểu đồ trong đó mỗi nút có mối quan hệ (khoảng cách chỉnh sửa) với mọi nút khác. Điều này không nằm trong phạm vi mô hình dữ liệu bình thường. Nó cũng không phải là một tính năng vĩnh viễn của cơ sở dữ liệu của bạn (giả sử bạn giải quyết các quy trình nghiệp vụ dẫn đến dữ liệu trùng lặp) vì vậy nó không đáng để đổ mồ hôi qua giải pháp phù hợp nhất với lý thuyết quan hệ. Những gì chúng ta cần là một giải pháp thiết thực.

Hãy coi đó là ma trận. Nếu chúng ta tiến hành xử lý tối ưu, chúng ta sẽ không thực thi các điểm số trùng lặp. Vì vậy, chúng tôi ghi địa chỉ 1 vào tất cả các địa chỉ khác, chúng tôi ghi địa chỉ 2 với tất cả các địa chỉ khác ngoại trừ địa chỉ 1, chúng tôi ghi địa chỉ 3 với tất cả các địa chỉ khác ngoại trừ địa chỉ 1 và 2, v.v. như bảng giải đấu bóng đá:

  addr 
      1 2  3 4  5 
addr 
    1  - 95 95 80 76 
    2  - - 100 75 72 
    3  - -  - 75 72 
    4  - -  - - 83 
    5  - -  - -  - 

Dữ liệu này có thể được lưu trữ trong đề xuất 1, bảng ID1, ID2, SCORE. Mặc dù chúng tôi cần phải xoay vòng dữ liệu để có được kết quả đầu ra như thế :)

Trong một bảng xếp hạng phù hợp có hai bộ điểm - Nhà và Xa - vì vậy bàn là đối xứng. Nhưng điều đó không áp dụng ở đây, vì khoảng cách chỉnh sửa cho 1 > 2 cũng giống như 2 > 1. Tuy nhiên, nó sẽ làm cho truy vấn kết quả đơn giản hơn nếu tập kết quả bao gồm các điểm được nhân đôi. Tức là, đối với hồ sơ (1,5,76), (2,5,72), v.v ... chúng tôi tạo bản ghi (5,1,76), (5,2,72). Điều này có thể được thực hiện vào cuối quá trình chấm điểm.

  addr 
      1 2  3 4  5 
addr 
    1  - 95 95 80 76 
    2  95 - 100 75 72 
    3  95 100  - 75 72 
    4  80 75 75 - 83 
    5  76 72 72 83  - 

Tất nhiên, điều này chủ yếu là một điều trình bày, vì vậy nó chỉ cần được thực hiện cho mục đích hiển thị, ví dụ: xuất dữ liệu vào bảng tính. Chúng tôi vẫn có thể nhận được tất cả các điểm cho, nói, Địa chỉ 5 trong một thời trang có thể đọc được mà không miiroring điểm số bằng cách sử dụng câu lệnh SQL đơn giản:

select case when id1 = 5 then id1 else id2 end as id1 
     , case when id1 = 5 then id2 else id1 end as id2 
     , score 
from your_table 
where id1 = 5 
or  id2 = 5 
/
+0

Cảm ơn APC. Ma trận đó có ý nghĩa và giúp hình dung nó. Câu lệnh SQL đó cũng thực sự là tay. Cảm ơn. – alj

1

Như thường lệ nó phụ thuộc vào những gì bạn muốn làm với dữ liệu khi bạn đã tính toán nó.

Giả sử nó chỉ đơn giản là để xác định hoặc xác định vị trí trùng lặp thì đề xuất của bạn 1 là những gì tôi muốn sử dụng, tức là một bảng thứ hai chỉ đơn giản là lưu trữ các cặp và thế mạnh. Đề xuất duy nhất của tôi là làm cho các điểm mạnh có một số nguyên thay vì một số thập phân.

+0

Tôi cần hiển thị lại dữ liệu cho những người duy trì dữ liệu để họ có thể xem xét và kiểm tra. Vì vậy, trong đó tôn trọng đề nghị đầu tiên của tôi sẽ đủ tôi giả sử. Nhưng tôi muốn biết nếu có một cách 'chuẩn' để lưu trữ thông tin như vậy, tôi có thể có khả năng xuất nó thành nhiều định dạng khác nhau tùy thuộc vào những gì họ muốn (vì họ sẽ không nghi ngờ gì khi nói rằng họ muốn nó thực hiện theo cách khác!). Ngoài ra ... đó là một oportunity tốt để cải thiện sự hiểu biết của tôi về lược đồ cơ sở dữ liệu. – alj

+0

... và cảm ơn Richard. – alj

+0

Đó là cách tôi luôn làm. Đôi khi giải pháp đơn giản nhất chỉ hoạt động và chúng tôi không cần tìm kiếm bất cứ điều gì phức tạp hơn. Giải pháp đầu tiên sẽ hoạt động và sẽ đủ hiệu quả và tạo ra kết quả bạn cần. –

6

Cách để đối phó với các mối quan hệ đối xứng trong một hệ thống quan hệ như sau:

  • chọn một hình thức kinh điển trong đó các cặp đối xứng được lưu trữ, ví dụ: customer_id1 < customer_id2.
  • Xác định một cái nhìn SYMM_TBL như chọn id1, id2, ... từ ... UNION select id2 như id1, id1 như id2, ... FROM ...

hệ thống Decent ought không trừng phạt bạn ở khu vực hiệu suất khi truy vấn chế độ xem này.

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