2009-06-17 33 views
22

Khi nào tham chiếu vòng tròn được chấp nhận trong cơ sở dữ liệu?Tham chiếu vòng tròn có được chấp nhận trong cơ sở dữ liệu không?

Lý thuyết và thực tế, mọi trợ giúp đều được đánh giá cao.

+0

thậm chí không gần là câu hỏi! Xin vui lòng cung cấp thêm chi tiết ... –

+0

Câu hỏi của bạn là gì? – Macarse

+0

Tham khảo thông tư, không. Tài liệu tham khảo hình cầu là không sao. Bạn được khuyến khích để xem xét điều đó. – fig

Trả lời

11

Các bản ghi trỏ đến các bản ghi khác hữu ích trong cơ sở dữ liệu. Đôi khi những hồ sơ này tạo thành một chu kỳ. Điều này vẫn có thể hữu ích. Sự khó chịu thực sự duy nhất trong thực tế là tránh vi phạm các ràng buộc.

Ví dụ: nếu bạn có bảng người dùng và giao dịch, người dùng có thể có con trỏ đến giao dịch cuối cùng của mình. Trước tiên, bạn cần chèn giao dịch, sau đó cập nhật last_transaction_id thành giá trị chính xác. Mặc dù cả hai bản ghi này đều tồn tại nhưng bạn không thể xóa chúng vì các điểm user.last_transaction_id trỏ đến transaction.idtransaction.user_id trỏ đến user.id. Điều này ngụ ý rằng người dùng không có giao dịch có giá trị là last_transaction_id. Nó cũng có nghĩa là bạn phải vô hiệu trường đó trước khi bạn có thể xóa giao dịch.

Quản lý các ràng buộc khóa ngoại là một nỗi đau nhưng chắc chắn là có thể.Có thể có các vấn đề phát sinh nếu bạn thêm các ràng buộc vào cơ sở dữ liệu sau đó giới thiệu các phụ thuộc vòng tròn mới. Bạn phải cẩn thận trong tình huống này. Tuy nhiên, miễn là một trong các bản ghi trong chu kỳ có trường khóa ngoài có thể vô hiệu, chu trình có thể bị hỏng và các bản ghi có thể bị xóa. Cập nhật thường không phải là vấn đề miễn là bạn chèn các bản ghi theo đúng thứ tự.

1

Cần tránh tham khảo thông tư như bệnh dịch hạch. Có thể thiết lập các mối quan hệ hai chiều, hoặc thậm chí là các mối quan hệ với bản thân bạn (nếu bạn là một bảng), nhưng sự phụ thuộc vòng tròn chỉ là yêu cầu sự cố.

+0

bạn có ý nghĩa gì với mối quan hệ hai chiều? ghi Một điểm vào B và C? Trái ngược với điểm A đến điểm B và B đối với A? cái thứ hai chắc chắn là hình tròn. –

1

Tôi đã xem các tham chiếu vòng tròn được thực hiện vì lý do hiệu suất. Có vẻ xấu xí mặc dù, và hiệu suất có thể là không đáng kể.

Ví dụ: một số bảng thông báo (Tôi nghĩ phpBB thực hiện việc này) có dấu cuối cùng trong bảng danh mục là lối tắt đến bài đăng cuối cùng trong chuỗi.

Điều này tạo ra một vòng tròn, trong đó bài đăng cuối cùng có FK đến bảng danh mục và bảng danh mục có FK trở lại bài đăng cuối cùng.

Như tôi đã nói, tôi không thực sự thích nó, nhưng tôi đã thấy nó được thực hiện.

0

hiếm khi tôi chạy qua một 1: mối quan hệ 1 đó là cần thiết và áp đặt một mối quan hệ hình tròn

lưu ý rằng các lĩnh vực ngoại quan trọng trong một mối quan hệ như vậy phải nullable, nếu không bạn không bao giờ có thể xóa các hàng từ bảng

0

Tôi đoán đó không phải là vấn đề nếu bạn đang sử dụng cơ sở dữ liệu chỉ ghi. Nếu bạn dự định sử dụng phần RUD của CRUD, bạn có thể gặp phải các vấn đề phức tạp (thường tránh được) trong việc giải quyết chúng.

3

Về mặt kỹ thuật có thể thực hiện được, nhưng nó có thể gây ra tất cả các vấn đề khi xóa hồ sơ vì nó tạo ra các vấn đề về trứng và trứng. Những vấn đề này thường có hành động quyết liệt như tự bỏ FK và xóa các mục vi phạm để giải quyết.

Nếu bạn có một mối quan hệ như:

create table foo_master (
     foo_master_id int not null primary key 
     ,current_foo_id int 
) 


create table foo_detail (
     foo_detail_id int not null primary key 
     foo_master_id int not null 
) 

alter table foo_master 
    add constraint fk_foo_current_detail 
     foreign key (current_foo_id) 
     references foo_detail 

alter table foo_detail 
    add constraint fk_foo_master 
     foreign key (foo_master_id) 
     references foo_master 

Sau đó xoá một bản ghi có thể gây ra như một vấn đề con gà và agg do sự phụ thuộc vòng tròn.

Một schema tốt hơn cho điều này có vẻ như:

create table foo_master (
     foo_master_id int not null primary key 
) 


create table foo_detail (
     foo_detail_id int not null primary key 
     foo_master_id int not null 
     is_current char (1) 
) 

alter table foo_detail 
    add constraint fk_foo_master 
     foreign key (foo_master_id) 
     references foo_master 

Điều này có nghĩa rằng các mối quan hệ là không theo chu kỳ và kỷ lục foo_detail 'hiện tại' vẫn có thể được xác định.

3

Một trong những bổ sung mới nhất cho cú pháp truy vấn phân cấp Oracle - từ khóa NOCYCLE - được tạo cho mục đích rõ ràng - để xử lý các tham chiếu vòng tròn trong dữ liệu. Tôi không thấy bất cứ điều gì sai trái với nó, và đã phải đối phó với loại mô hình này trước đây. Nó không phải là quá khó khăn, đặc biệt là trong Oracle có hỗ trợ khó khăn hạn chế.

20

Xem xét các thành phố và tiểu bang. Mỗi thành phố tồn tại trong một tiểu bang. Mỗi tiểu bang có một thành phố thủ đô.

CREATE TABLE city (
    city VARCHAR(32), 
    state VARCHAR(32), 
    PRIMARY KEY (city), 
    FOREIGN KEY (state) REFERENCES state (state) 
); 

CREATE TABLE state (
    state VARCHAR(32), 
    captial_city VARCHAR(32), 
    PRIMARY KEY (state), 
    FOREIGN KEY (captial_city) REFERENCES city (city) 
); 

Vấn đề đầu tiên - Bạn không thể tạo các bảng này như được hiển thị. Giải pháp là tạo chúng mà không có các khóa lạ, và sau đó thêm các khóa ngoài sau đó.

Vấn đề thứ hai - bạn không thể chèn hàng vào một trong hai bảng, vì mỗi lần chèn sẽ yêu cầu hàng có sẵn trong bảng khác. Giải pháp là đặt một trong các cột khóa ngoài là NULL và chèn dữ liệu đó vào hai giai đoạn. ví dụ.

INSERT INTO city (city, state) VALUES ('Miami', NULL); 
INSERT INTO state (state, capital_city) VALUES ('Florida', 'Miami'); 
UPDATE city SET state='Florida' WHERE city='Miami'; 
+0

Cảm ơn. Ví dụ tốt. Máy chủ SQL đưa ra lỗi cho khóa ref - oreign này 'FK__city__state__007EABC' tham chiếu bảng không hợp lệ 'trạng thái'. Không thể tạo ràng buộc. Xem các lỗi trước đó. – Steam

+0

Các khả năng khác để chèn các hàng mà không cho phép NULL-Giá trị: 1. CHERTN TẤT CẢ, 2. Các ràng buộc đáng lo ngại. Ngoài ra khi xóa: 3. DELESE CASCADE – Falco

+1

@Falco Bạn có thể vui lòng trỏ đến một ví dụ (làm việc) của việc sử dụng INSERT ALL với FK tròn? –

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