2010-06-29 14 views
5

tôi đang làm việc trên một PHP mã nguồn mở/ứng dụng MySQLCó phải thực tế phổ biến cho các ứng dụng PHP/MySQL có tuyên bố Khóa Ngoại?

Tôi đã nhìn phpBB, Wordpress, và các ứng dụng khác để xem họ định Keys nước ngoài hay không (để đảm bảo tính toàn vẹn tham chiếu)

tôi không thể tìm thấy rằng họ có

Có thực tế phổ biến trong các loại ứng dụng này để chỉ định khóa ngoại trong cấu trúc cơ sở dữ liệu MySQL không?

Trả lời

4

quá khứ sử dụng MySQL công cụ lưu trữ MyISAM theo mặc định, không hỗ trợ các ràng buộc khóa ngoài. Trừ khi bạn khai báo rõ ràng các bảng sử dụng công cụ lưu trữ InnoDB, hoặc thay đổi máy chủ lưu trữ mặc định trên máy chủ, không có khóa ngoại nào xuất hiện, và không có gì ngạc nhiên khi các nhà phát triển phần mềm thiết kế cho MySQL không bận tâm đến việc sử dụng các ràng buộc khóa ngoài.

MySQL 5.5 hiện đang ở giai đoạn thử nghiệm và cuối cùng là InnoDB sẽ là công cụ lưu trữ mặc định. Vì vậy, các ràng buộc khoá ngoại sẽ được hỗ trợ ra khỏi hộp.

Có, nên sử dụng khóa ngoài. Những ràng buộc này giúp đảm bảo dữ liệu của bạn luôn đáp ứng tính toàn vẹn tham chiếu. Cách khác là cơ sở dữ liệu của bạn dần dần lấp đầy với "mẩu vụn" hoặc các hàng tham chiếu đến hàng cha mẹ không còn trong cơ sở dữ liệu nữa. Những điều này có thể dẫn đến kết quả lạ từ truy vấn và không gian lãng phí, truy vấn không hiệu quả, và bạn sẽ tự dọn dẹp công việc dọn dẹp sẽ không cần thiết nếu bạn chỉ có cơ sở dữ liệu thực thi sự sạch sẽ cho bạn.


Re cách comment @Jacob: điểm tốt, nhưng hãy chắc chắn để đọc gần đây bài viết so sánh InnoDB so với MyISAM Những năm trước đây, MyISAM được coi là "công cụ lưu trữ nhanh" và InnoDB được coi là công cụ lưu trữ bạn 'd miễn cưỡng phải sử dụng nếu bạn không thể làm mà không có giao dịch.

Nhưng InnoDB đã cải thiện đáng kể trong vài năm qua và trong hầu hết các trường hợp hôm nay InnoDB thực hiện nhanh hơn so với MyISAM.

Ngoài MyISAM vẫn hỗ trợ lập chỉ mục toàn văn như bạn đề cập, có ít và ít lý do hơn để sử dụng MyISAM. Khi tôi cần lập chỉ mục toàn văn, tôi hoặc duy trì một bảng MyISAM như một tấm gương của lưu trữ chính của tôi trong InnoDB, hoặc người nào khác tôi sử dụng Apache Solr.

+0

cảm ơn bạn, điều đó có ý nghĩa – samJL

+0

+1 - đảm bảo bạn hiểu được nhược điểm của việc sử dụng innoDB trên MyISAM. Thực hiện tìm kiếm Google cho innoDB vs MyISAM, có nhiều bài viết thảo luận về những lợi thế và bất lợi của cả hai. Vì vậy, nó thực sự phụ thuộc vào những gì bạn đang sử dụng DB cho dù bạn thực sự muốn/cần toàn vẹn tham chiếu trên một số trong những lợi thế mà MyISAM mang lại. Một trong những điều mà tôi vừa phát hiện ra tuần trước là innoDB không hỗ trợ tìm kiếm toàn văn (chưa), nhưng MyISAM thì: ( – Jacob

+0

Quy tắc chung của tôi khi nói đến InnoDB so với MyISAM là, nếu bạn cần tìm kiếm toàn văn MyISAM có một lợi thế lớn so với InnoDB về tốc độ –

0

MySQL được sử dụng để không tôn trọng khóa ngoại. Nó vẫn không, trừ khi bạn có biện pháp.

Hết thị giác, ngoài tâm trí, phải không?

1

Tôi không chắc nó phổ biến như thế nào, nhưng tôi cảm thấy rằng bạn nên thể hiện các điều kiện của mô hình đối tượng hoàn toàn bất kể cơ sở dữ liệu bên dưới có hỗ trợ đầy đủ hay không.

Nếu bạn thường viết ANSI SQL, sau đó nếu bạn tiếp tục và thêm ràng buộc khóa ngoài, khi cơ sở dữ liệu hỗ trợ, bạn sử dụng công cụ hỗ trợ hoặc chuyển sang cơ sở dữ liệu khác hỗ trợ chúng sau đó bạn sẽ nhận được chúng cho "miễn phí" và không phải quay trở lại và cố gắng tìm tất cả các mối quan hệ.

Vì vậy, tôi sẽ đặt các khóa ngoại trong SQL, nhưng đó là tôi và một lần nữa có thể không phổ biến.

+0

Không, tôi cũng vậy. Trừ khi tôi đang viết một lược đồ throwaway cho một câu hỏi SO. –

+0

cảm ơn giống như một thực hành tốt – samJL

0

Trong MySQL chỉ InnoDB thậm chí hỗ trợ khóa ngoại, và chỉ sau MySQL 5.1.

Edit: InnoDB sẽ là công cụ lưu trữ mặc định trong MySQL 5,5

Sửa-Bỏ qua: tham chiếu Integrety sẽ là một "tính năng mới" trong 6.1 theo lộ trình của họ: các phiên bản http://en.wikipedia.org/wiki/MySQL#Future_releases

+0

Thông tin wiki đó thực sự đã lỗi thời. MySQL 6 bị treo và MySQL 5.5 sẽ hỗ trợ InnoDB làm công cụ lưu trữ mặc định. –

+0

@Bill Karwin, PHP 6 bị loại bỏ, MySQL 6 bị loại bỏ, có thứ gì đó với những thứ 6. –

+1

Tôi đã chỉnh sửa đoạn wikipedia mà bạn đã liên kết. –

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