2009-02-20 24 views
9

Tôi đang xây dựng một diễn đàn nhỏ để thực hành. Tôi thấy rằng các diễn đàn như phpBB lưu trữ văn bản chuỗi trong một bảng riêng biệt.Bạn sẽ cấu trúc lược đồ DB của diễn đàn như thế nào?

Tại sao? Tại sao không lưu trữ tất cả trong cùng một bảng?

Một cái gì đó như: thread_id, thread_date, thread_text, thread_author

Tại sao nó được thực hiện theo cách này? Bạn sẽ làm điều này như thế nào?

+0

Tôi không đồng ý, chủ đề này đã được thảo luận rộng rãi trên đây và các trang web khác. http://stackoverflow.com/questions/548793/a-good-tutorial-on-creating-a-php-forum-from-scratch/548810#548810 – barfoon

+0

@barfoon, đây không phải là việc tạo một diễn đàn, anh ấy muốn biết tại sao phpBB làm những gì nó làm. Tôi nghĩ đó là một câu hỏi hay. Bây giờ nếu anh ta hỏi, cách tốt nhất để xây dựng một diễn đàn là gì, tôi đồng ý với bạn. – Malfist

+0

"Bạn nghĩ gì là cách tốt nhất?" không âm thanh cụ thể cho phpBB. – barfoon

Trả lời

1

Chúng không lưu trữ văn bản trong cùng một bảng vì kích thước bảng có thể tiếp cận.

Bằng cách này, ngay cả với số lượng mục nhập rất lớn, bảng danh sách chủ đề nhỏ, được lập chỉ mục tốt và rất nhanh để quét nó. Văn bản chỉ được truy cập khi cần thiết, sử dụng khóa chính cũng nhanh.

Đối với các diễn đàn nhỏ, tôi nghĩ điều này là không cần thiết, vì có một ít chi phí mã hóa.

+1

TEXT cột được lưu trữ out-of-hàng trong cả hai động cơ, nó hầu như không ảnh hưởng đến kích thước bảng. – Quassnoi

+0

Tôi đồng ý - Tôi nghĩ rằng lời giải thích của Mario là chính xác –

1

Ngoài câu trả lời xuất sắc của Julien, việc chuyển bài đăng sang các chủ đề khác là khá phổ biến (bằng cách nói một quản trị viên hoặc người kiểm duyệt). Có văn bản trong "bảng bài" giúp hỗ trợ điều này.

+0

Ý tưởng hay, không bao giờ nghĩ về nó. – Quassnoi

2

InnoDB không hỗ trợ việc lập chỉ mục FULLTEXTMyISAM không hỗ trợ giao dịch.

Không biết phpBB, nhưng có lẽ đó là lý do tại sao họ tách các bảng.

+0

Bạn đứng trước tôi 1 giây>< – Mario

3

Không bao giờ nhìn vào bên trong các đường dẫn phpBB, nhưng coi chừng nó là do lập chỉ mục toàn văn. Động cơ Inno-db cho bảng chính để cho phép giao dịch và những gì không. MyIsam để lập chỉ mục toàn văn.

+1

Vâng ... phpBB, ít nhất là trong các phiên bản trước 3.0, đã sử dụng MyISAM cho tất cả các bảng. –

3

Đối với một điều, bố cục hệ thống tệp của hầu hết các cơ sở dữ liệu quan hệ là lưu trữ khối lớn văn bản hoặc dữ liệu tùy ý có thể làm chậm hệ thống. Vì dữ liệu thường được lưu trữ theo hàng, khi thực hiện tìm kiếm, cơ sở dữ liệu giờ đây phải bỏ qua các trường văn bản có độ dài thay đổi ngay cả khi tìm kiếm các trường không liên quan.

Thứ hai, đặt tất cả mọi thứ trong một bảng làm cho nó khó khăn hơn để thêm vào mô hình dữ liệu sau này, nếu bạn cần thêm dữ liệu cho mỗi thread_id, ví dụ.

Thiết kế lược đồ cơ sở dữ liệu cũng yêu cầu một số kiến ​​thức. Bạn nên bắt đầu với http://en.wikipedia.org/wiki/Database_normalization. Hãy chắc chắn hiểu biểu mẫu thứ ba bình thường.

4

Tôi thực sự không biết tại sao điều này được thực hiện, nhưng một lý do tôi có thể tưởng tượng là tối ưu hóa tìm kiếm và truy xuất siêu dữ liệu bài đăng (ngày, tác giả, v.v.).

According to Joel (và Joel luôn đúng! ;-) cơ sở dữ liệu lưu trữ dữ liệu của chúng trong trường độ dài cố định soạn các bản ghi có độ dài cố định, do đó, dễ dàng chuyển từ một hàng sang hàng kế tiếp chỉ bằng cách tăng con trỏ theo độ dài byte của một bản ghi. Nhưng các trường văn bản lớn được sử dụng để lưu trữ văn bản bài đăng không thể có kích thước cố định, vì độ dài của bài đăng thay đổi trên phạm vi rộng và tạo dung lượng lưu trữ cố định đủ lớn để giữ tất cả các bài đăng sẽ lãng phí một lượng lớn không gian. Điều đó có nghĩa là lưu trữ văn bản trong cùng một bảng với các thông tin khác sẽ làm cho nó chậm hơn rất nhiều khi bạn muốn lấy siêu dữ liệu cho số lượng lớn các bài đăng, như được thực hiện mỗi khi ai đó xem trang diễn đàn chính.

Cách để tận dụng tối đa cả hai thế giới là đặt các trường có độ dài cố định (ví dụ: mọi thứ ngoại trừ văn bản bài đăng) trong một bảng và các trường có độ dài thay đổi (ví dụ: văn bản bài đăng).

+0

Điều đó có thể đúng đối với một số người (hãy nói DBMS 'cũ' hoặc 'nguyên thủy') nhưng hầu như không cho hầu hết những người hiện đại - http://www.postgresql.org/docs/current/static/storage-toast.html. –

12

Tôi đã tìm thấy giản đồ thú vị này trực tuyến.

schema http://yensdesign.com/tutorials/forumsdatabase/schemaFull.jpg

dường như khởi động khá tốt cho các lược đồ cơ sở dữ liệu của bất kỳ diễn đàn cơ bản.

Tôi biết điều này là cũ, nhưng tôi đoán rằng tôi sẽ đăng bài này cho bất kỳ ai sẽ tìm thấy câu hỏi này một lần nữa.

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