2010-11-11 27 views
5

Tôi đang cố gắng tìm một hướng dẫn sẽ hướng dẫn tôi về cách hoạt động của các trường tùy chỉnh dựa trên người dùng. Giống như trong các trang khảo sát, nơi họ cho phép người dùng tạo các trường tùy chỉnh và lưu trữ chúng và quan trọng hơn là lưu trữ dữ liệu được nhập thông qua các trường đó.Cách lưu trữ các trường người dùng tùy chỉnh trong cơ sở dữ liệu

Tôi đang tìm một cái gì đó mô tả cách thực hiện điều này trên cơ sở dữ liệu. Tôi đang gặp một chút rắc rối khi tìm một cách mà sẽ không lấy mất dữ liệu này một khi người dùng muốn trích xuất nó ra các tệp excel/cvs.

Trả lời

3

Entity-Attribute-Value model thường được sử dụng để xử lý tình huống này trong cơ sở dữ liệu quan hệ. Tìm kiếm nhanh "Mô hình EAV" sẽ mang lại nhiều thông tin hơn bạn sẽ biết phải làm gì.

+0

'Tìm kiếm nhanh cho "mô hình EAV"' hy vọng sẽ bao gồm đề xuất cần tránh trừ khi Không có phương án thay thế - nó rất linh hoạt, nhưng không mở rộng và có thể khó truy vấn. Đây là liên kết đến nghiên cứu điển hình: http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/ –

3

Biểu mẫu thứ sáu bình thường là cách chính thức để thực hiện việc này. Đi với 3NF cho tất cả các bảng và 6NF cho một hoặc hai bảng mà bạn cần thêm các cột không có thay đổi DDL. Sử dụng một cách tiết kiệm.

EAV là con trai khốn của 6NF. Điều đó có nghĩa là, những người làm điều đó, và viết về nó, không có một sự hiểu biết chính thức của 6NF, do đó, thường là tạo ra những quái vật.

Tất nhiên, bạn phải giữ lại các tiêu chuẩn tốt: sử dụng các kiểu dữ liệu; Tính toàn vẹn tham chiếu khai báo (Khóa ngoại); vv Không cho những người lên có được bất cứ điều gì. Chạy như địa ngục xa bất cứ ai nói với bạn bạn phải cung cấp cho họ lên.

6NF/EAV rất nhanh, không có trở ngại khi sử dụng khả năng xử lý thiết lập của máy chủ. Một lần nữa, chạy như địa ngục đi từ bất cứ ai nói với bạn rằng bạn phải sử dụng hàng-by-hàng chế biến hoặc con trỏ hoặc bạn không thể xây dựng các cột từ các hàng một cách dễ dàng. Đăng lại nếu bạn có vấn đề cụ thể.

Điều này yêu cầu vượt quá khả năng hiện tại (điều khiển, DDL) của SQL; để làm điều đó theo cách được kiểm soát và tránh tạo ra những con quái vật không thể duy trì được, bạn cần một danh mục nhỏ, để chứa siêu dữ liệu. Nếu bạn thông minh, bạn có thể sử dụng nó tạo ra SQL chạy lại để truy vấn, và do đó loại bỏ rất nhiều lao động thủ công.

Có rất nhiều thông tin sai lệch xung quanh, và một số người có "đại diện" là không biết gì. Để thành công về mặt kỹ thuật, chúng ta cần thông tin chính xác, không phải huyền thoại và sợ hãi mong muốn. Bạn có thể quan tâm đến một bài đăng gần đây mà tôi đã cố gắng để set the recond straight.

0

Chúng tôi sử dụng 3 bảng cho mỗi bảng này, nơi chúng tôi cần hỗ trợ các trường do người dùng xác định. Vì vậy, ví dụ, nếu bạn muốn áp dụng điều này để bàn KHẢO SÁT của bạn, bạn có thể tạo:

SURVEY_ATTRIBUTE 
- SurveyAttributeId 
- SurveyAttributeName 
- SurveyAttributeType 

SURVEY_ATTRIBUTE_CHOICE 
- SurveyAttributeChoiceId 
- SurveyAttributeChoice 
- SurveyAttributeId 

SURVEY_ATTRIBUTE_VALUE 
- SurveyAttributeValueId 
- SurveyId 
- SurveyAttributeValue 

Các SURVEY_ATTRIBUTE cửa hàng bảng một bản ghi cho mỗi thuộc tính tùy chỉnh. Bảng SURVEY_ATTRIBUTE_VALUE lưu trữ các thuộc tính thực sự được gán cho khảo sát. Vì vậy, nếu một thuộc tính không áp dụng cho một servey, không có gì được lưu trữ. Bảng SURVEY_ATTRIBUTE_CHOICE lưu trữ tất cả các lựa chọn cho phép đối với các thuộc tính của loại 'LIST'.

Trường SurveyAttributeType trong bảng SURVEY_ATTRIBUTE được sử dụng để mô tả loại thuộc tính. Chúng tôi chỉ sử dụng một số lượng nhỏ các loại được phép như CHAR, DATE, NUMBER, LIST. Tùy thuộc vào giá trị đó, ứng dụng của chúng tôi biết phải làm gì với giá trị được lưu trữ trong trường SurveyAttributeValue. Tất nhiên, bạn có thể chính thức hóa việc này để cho phép phạm vi rộng hơn, chỉ định chiều dài trường tối đa, v.v., tất cả phụ thuộc vào mức độ tự do bạn muốn cung cấp cho người dùng cuối của mình. Chúng tôi cố gắng giữ cho nó đơn giản nhất có thể cho đối tượng mục tiêu của chúng tôi không phải là quản trị viên cơ sở dữ liệu mà là người dùng cuối, họ thường không quan tâm đến độ dài trường và như vậy.

Bạn cũng có thể chọn bỏ qua bảng SURVEY_ATTRIBUTE_CHOICE và lưu trữ các giá trị cho phép của bạn trong chuỗi XML trong trường SURVEY_ATTRIBUTE. Điều đó sẽ phụ thuộc vào cách bạn sẽ thực hiện trong ứng dụng của bạn.

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