2010-10-11 18 views
8

Tôi đã cố gắng trả lời một vấn đề cấu trúc dữ liệu Mysql phức tạp cho các trường tùy chỉnh cho một ứng dụng trực tuyến. Tôi khá mới để Mysql vì vậy bất kỳ đầu vào được đánh giá cao.Mảng, EAV, LOB được tuần tự hóa cho các trường tùy chỉnh?

Cơ sở dữ liệu hiện tại là cơ sở dữ liệu quan hệ và mỗi người dùng dịch vụ sẽ chia sẻ cùng cơ sở dữ liệu và bảng.

Đây là một ví dụ về những gì tôi đang cố gắng làm.

Giả sử tôi đang cố tạo danh sách. Danh sách này có thể chứa tối đa 30 trường tùy chỉnh. Người dùng có thể chọn giữa 12 yếu tố duy nhất và mỗi phần tử có thể có tối đa 15 thuộc tính do người dùng xác định.

Mỗi danh sách có thể là duy nhất trong tài khoản cũng như giữa các tài khoản. Tài khoản có thể có nhiều danh sách và mỗi danh sách có thể có số lượng phần tử khác nhau cũng như các thuộc tính khác nhau cho mỗi phần tử.

Một yếu tố có thể được nhiều thứ, ví dụ như: trắc nghiệm, nút radio, lĩnh vực điện thoại, địa chỉ, văn bản dòng duy nhất, nhiều dòng văn bản, vv

Một ví dụ về thuộc tính cho trắc nghiệm (hộp kiểm) phần tử có thể là: đỏ, lục, lam, cam, trắng, đen

Ví dụ về thành phần văn bản một dòng có thể là: Trường nhập Tên đầu tiên.

Mỗi phần tử cũng phải có trường tiêu đề do người dùng xác định và trường thẻ có thể được tham chiếu và sử dụng trong các tính năng khác của ứng dụng.

Phân đoạn cũng rất quan trọng. Người dùng cần có thể phân đoạn danh sách dựa trên bất kỳ phần tử nào. Ví dụ: người dùng có thể muốn phân đoạn danh sách "ABC" dựa trên tất cả các bản ghi có "màu đỏ" trong phần tử lựa chọn số 1 (chúng có thể có nhiều hơn 1 yếu tố lựa chọn cho một danh sách).

Trong ví dụ này, tôi giả định rằng mảng, EAV, LOB được tuần tự hóa sẽ hoạt động tốt. Tuy nhiên, tôi không chắc đó là cấu trúc tốt nhất cho nhu cầu của tôi ở quy mô của tôi.

Trong thực tế, rất có thể sẽ có tối đa 50.000 bản ghi cho mỗi danh sách và có khả năng thực sự là 20.000 tài khoản - mỗi tài khoản có nhiều danh sách. Vì vậy, tôi đang tìm kiếm cấu trúc hiệu quả và linh hoạt nhất.

Để làm cho vấn đề phức tạp hơn, tôi cũng cần đảm bảo cách hiệu quả để thêm/xóa các phần tử vào bất kỳ danh sách cụ thể nào vào bất kỳ thời điểm nào. Ví dụ: nếu người dùng tạo danh sách có số trường cho phép tối đa (30) và sau đó ba tháng sau quyết định họ muốn xóa trường, tôi cần một cách để tìm danh sách đó và tất cả giá trị được liên kết cho trường tùy chỉnh đó và sau đó xóa tất cả các giá trị, loại phần tử và các thuộc tính của nó. Sau đó, người dùng sẽ được phép thêm phần tử mới vào danh sách này.

Tôi đã xem xét nhiều bài đăng trên EAV trên trang web này, cũng như điều này http://www.martinfowler.com/eaaCatalog/serializedLOB.html Dường như EAV sẽ không hiệu quả với nhu cầu của tôi do các nhược điểm truy xuất dữ liệu.

Tôi cũng tự hỏi một mảng đa chiều sẽ hoạt động như thế nào ở quy mô này? Tôi tin rằng wordpress sử dụng điều này cho các lĩnh vực tùy chỉnh của họ.

Bất kỳ đầu vào nào cũng sẽ được đánh giá rất cao về cách tốt nhất để cấu trúc cơ sở dữ liệu cho tình huống này. Cảm ơn bạn!

+0

Tôi cũng đang đối mặt với cùng một thách thức - bạn đã đi với giải pháp nào? Tôi rất quan tâm đến kinh nghiệm của bạn. – philwilks

Trả lời

0

Bạn có thể sử dụng mã hóa và giải mã json (tôi giả sử bạn đang sử dụng PHP) để lưu trữ thông tin đầu vào trong bảng với một nhóm để lưu trữ người dùng và lưu trữ dữ liệu này dưới dạng văn bản. Các câu trả lời phải được lưu trữ trong một bảng khác (với một FK để sử dụng CASCADE ON DELETE).

Nếu bạn có thể chỉ định kích thước tối đa của đặc tả đầu vào, hãy sử dụng trường varchar.

Điều này không thể là bản nháp tốt nhất (cần một số kiểm tra lược tả để đảm bảo rằng nó đủ mạnh) nhưng chắc chắn có thể được sử dụng.

1

Bạn có thể đọc về cách FriendFeed thực hiện các lĩnh vực tùy chỉnh: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

Họ sử dụng một sự kết hợp của In nhiều LOB, với các bảng phụ có chứa chỉ số đảo ngược. Bạn không cần một bảng phụ cho mọi thuộc tính có thể có trong LOB của bạn, chỉ những thuộc tính bạn muốn tìm kiếm với sự hỗ trợ từ một chỉ mục.

+0

http://bret.appspot.com/entry/how-friendfeed-uses-mysql không được tìm thấy –

+0

@wangyiran, không đáng ngạc nhiên, blog đó đã hơn 6 tuổi. Tôi mô tả kỹ thuật tương tự của việc lập chỉ mục ngược trong bản trình bày của tôi ở đây: http://www.slideshare.net/billkarwin/extensible-data-modeling. –

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