2012-12-19 29 views
6

Tôi đang xây dựng một ứng dụng PHP/MySQL và tôi cho phép người dùng tạo dữ liệu hồ sơ tùy chỉnh của riêng họ (nghĩa là họ có thể thêm bất kỳ lượng thông tin nào vào tiểu sử của họ với các hộp văn bản bổ sung, nhưng có một nhóm CORE "" của các trường hồ sơ người dùng)MySQL nhưng không biết tên cột trước khi tay

Ví dụ: họ có thể tạo hộp văn bản mới trên biểu mẫu và gọi nó là "thú cưng của tôi" và/hoặc "màu yêu thích của tôi ". Chúng tôi cần lưu trữ dữ liệu này trong cơ sở dữ liệu và không thể tạo rõ ràng các cột cho từng lựa chọn của họ vì chúng tôi không biết thông tin bổ sung của họ là gì trước khi thực hiện.

Một cách chúng ta nghĩ rằng chúng ta có thể lưu trữ tất cả "info addidional" mà họ cung cấp là để lưu trữ thông tin bổ sung của họ như JSON và lưu trữ nó trong một lĩnh vực văn bản MySQL (Tôi yêu MySQL :))

Tôi đã nhìn thấy Wordpress form builder plugins, nơi bạn có thể tạo các trường của riêng mình vì vậy tôi nghĩ rằng chúng phải lưu trữ dữ liệu trong MySQL bằng cách nào đó vì các giải pháp NoSQL nằm ngoài phạm vi của các plugin này.

Tôi rất muốn gắn bó với MySQL nhưng các bạn có nghĩ rằng các giải pháp NoSQL như MongoDB/Redis sẽ là một giải pháp tốt hơn vì điều này?

Cảm ơn

+0

Câu trả lời, bao giờ hết là _it depends_. Nếu bạn đã có hàng trăm nghìn người dùng, bạn sẽ cần phải thử nhiều giải pháp khác nhau để xem những gì sẽ mở rộng. Tuy nhiên, đối với một tập hợp nhỏ các tùy chọn cho một tập hợp các hàng tương đối nhỏ, JSON hoặc một giá trị PHP được tuần tự hóa, trong db quan hệ hiện có của bạn, là tốt. Tôi nghĩ rằng Wordpress sử dụng serialization nội bộ cho một số hồ sơ tùy chọn của nó. – halfer

+0

+1 cho một câu hỏi thú vị và một tính năng thú vị :-) –

Trả lời

1

Bạn có thể tạo một bảng các cặp khóa giá trị trong đó mọi thứ không nằm trong lõi sẽ được lưu trữ. Bảng sẽ trông giống như: user_id, name_of_user_specified_field, user_specified_value;

Bất kỳ name_of_user_specified_field nào bắt đầu hiển thị nhiều bạn có thể thêm vào bảng lõi. Điều này được gọi là Entity-Attribute-Value. Xin lưu ý, một số người coi đây là một mô hình chống.

Nếu bạn làm điều này, hãy thêm điều khiển để hạn chế số lượng các mục mới người dùng có thể tạo ra hoặc bạn có thể tìm thấy một người nào đó nhồi db của bạn với rất nhiều lĩnh vực :)

+0

Cảm ơn Ray không bao giờ nghĩ về điều này, nhưng nó có thể ??? trở nên lớn nếu có nhiều người dùng có nhiều trường tùy chỉnh? Bạn nghĩ sao? –

+1

@BillJobs vâng, đó là lý do tại sao bạn cần áp đặt một số giới hạn, như người dùng chỉ có thể tạo tối đa 10 trường tùy chỉnh. – Ray

+0

Rất rất đúng, giới hạn sẽ có ý nghĩa đối với "dữ liệu tùy chỉnh" –

3

Một cách tiếp cận này là sử dụng một bảng đơn sử dụng mô hình EAV hoặc Entity-Attribute-Value. Xem Wikipedia article. Điều đó sẽ khó khăn hơn nhiều so với việc cho phép người dùng chọn lược đồ cơ sở dữ liệu.

+0

Trông thực sự thú vị và phần giới thiệu dường như giải quyết vấn đề của tôi ... là bản địa của MySQL hay một mô hình thiết kế? –

+1

Đó là sự phù hợp tự nhiên đối với bất kỳ cơ sở dữ liệu quan hệ nào. Nó có thể được sử dụng trong bảng tính quá, tôi giả sử. – wallyk

0

MySQL có thể xử lý việc này tốt. Nếu dữ liệu bổ sung luôn luôn được kéo ra tất cả cùng nhau (nghĩa là bạn sẽ không bao giờ cần phải nhận được trường thú cưng mà không có bất kỳ trường bổ sung nào khác) thì bạn có thể lưu trữ nó theo thứ tự trong một cột trên bảng người dùng. Tuy nhiên, nếu bạn muốn có một mô hình quan hệ hơn, bạn có thể lưu trữ dữ liệu bổ sung trong một bảng riêng biệt được liên kết bởi ID người dùng. Bảng bổ sung sẽ có một cột cho ID người dùng, tên trường bổ sung giá trị trường bổ sung và bất kỳ thứ gì khác bạn có thể muốn với nó. Sau đó, bạn chỉ cần chạy truy vấn JOIN khi nhận hồ sơ để nhận tất cả các trường bổ sung.

+0

Cảm ơn bạn đã trả lời G-Nugget, được sắp xếp theo thứ tự tùy chọn duy nhất của tôi khi tôi không biết tên cột trước bàn tay? –

+0

@BillJobs Không, bạn chỉ có thể chèn một hàng mới vào bảng thông tin bổ sung với tên trường và giá trị mới. –

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