2010-02-08 34 views
26

Tôi đã tìm kiếm giải pháp cơ sở dữ liệu để cho phép các trường và giá trị do người dùng xác định (cho phép số không giới hạn). Thoạt nhìn, EAV có vẻ thích hợp, nhưng sau khi đọc thì tôi không chắc nữa.Cơ sở dữ liệu Các ưu và khuyết điểm của EAV

Ưu và khuyết điểm của EAV là gì?

Có phương pháp cơ sở dữ liệu thay thế nào để cho phép thuộc tính/trường và giá trị do người dùng xác định không?

+0

Xem http://stackoverflow.com/search?q=%5bdatabase%5d%20%2beav&tab=newest –

Trả lời

27

Đây không phải là một câu trả lời đầy đủ mà chỉ là một vài điểm về chủ đề.

Vì câu hỏi này cũng được gắn thẻ với thẻ [sql], hãy để tôi nói rằng, nói chung, relational databases không đặc biệt phù hợp để lưu trữ dữ liệu sử dụng mô hình EAV. Bạn vẫn có thể thiết kế một mô hình EAV trong SQL, nhưng bạn sẽ phải hy sinh nhiều lợi thế mà một cơ sở dữ liệu quan hệ sẽ cung cấp. Không chỉ bạn sẽ không thể thực thi tính toàn vẹn tham chiếu, sử dụng các kiểu dữ liệu SQL cho các giá trị và thực thi các thuộc tính bắt buộc, nhưng ngay cả các truy vấn rất cơ bản cũng có thể trở nên khó viết. Trong thực tế, để khắc phục hạn chế này, một số giải pháp EAV dựa vào sao chép dữ liệu, thay vì tham gia với các bảng có liên quan, như bạn có thể tưởng tượng, có nhiều hạn chế.

Nếu bạn thực sự yêu cầu thiết kế schemaless, "cho phép một số lượng không giới hạn các thuộc tính", đặt cược tốt nhất của bạn có lẽ là sử dụng giải pháp NoSQL. Mặc dù các điểm yếu của EAV so với các cơ sở dữ liệu quan hệ cũng áp dụng cho các lựa chọn NoSQL, bạn sẽ được cung cấp các tính năng bổ sung khó đạt được với các cơ sở dữ liệu SQL thông thường. Ví dụ, thường kho dữ liệu NoSQL có thể được thu nhỏ dễ dàng hơn nhiều so với các cơ sở dữ liệu quan hệ, đơn giản chỉ vì chúng được thiết kế để giải quyết một số vấn đề về khả năng mở rộng.

Nhiều nền tảng điện toán đám mây (như được cung cấp bởi Amazon, GoogleMicrosoft) có các kho dữ liệu dựa trên mô hình EAV, trong đó một số thuộc tính tùy ý có thể được liên kết với một thực thể nhất định. Nếu bạn đang xem xét việc triển khai ứng dụng của mình lên đám mây, bạn có thể coi đây là lợi thế kinh doanh, cũng như kỹ thuật, vì cạnh tranh gay gắt giữa các nhà cung cấp lớn đang đẩy tỷ lệ giá trị lên chi phí rất cao, bằng cách liên tục đẩy mạnh các tính năng và đẩy chi phí tài chính và triển khai xuống.

+10

tôi không thấy cách EAV là một lợi thế kỹ thuật: phức tạp hơn để xây dựng, truy vấn và chèn, và khả năng đọc rất thấp. Điều gì sẽ là một "chọn * từ" đơn giản và nhanh chóng trở thành một truy vấn sql quái vật chậm. Và tôi thậm chí không nói về việc cố gắng thực hiện một số báo cáo dựa trên mô hình EAV. – guigui42

+0

@ guigui42: Cảm ơn nhận xét của bạn. Bạn có một điểm, nhưng câu trả lời của tôi không có ý định đầy đủ. Tuy nhiên, vì nó đã được đánh dấu là được chấp nhận bởi OP, tôi đã cập nhật câu trả lời với một số cân nhắc thêm. –

+1

Tôi hơi bối rối về phần 'thi hành tính toàn vẹn tham chiếu'. Tôi đang sử dụng EAV và có nhiều khóa ngoại. Có thể sử dụng nhiều kiểu dữ liệu SQL nhờ UNION ALL và một số siêu dữ liệu ánh xạ các thuộc tính vào bảng (kiểu dữ liệu) mà chúng được lưu trữ. Bạn có thể cải thiện tốc độ truy vấn bằng cách thêm các cột được lập chỉ mục bổ sung vào bảng thực thể (như 'type 'ví dụ). –

-9

Có phương pháp cơ sở dữ liệu thay thế nào để cho phép thuộc tính/trường và giá trị do người dùng xác định không?

Một cách khác là thay đổi giản đồ cơ sở dữ liệu dựa trên đầu vào của người dùng: ví dụ: khi người dùng muốn trường mới, sau đó thêm cột tương ứng vào cơ sở dữ liệu.

+2

Nhược điểm của việc này là bạn sẽ có vô số các trường trống –

+1

@ChrisW: Các tình huống khả thi rất hạn chế trong quan điểm của tôi. –

+0

Một số cơ sở dữ liệu có hỗ trợ cho các cột 'thưa thớt' (ví dụ: SQL Server) làm cho phương pháp này trở nên khả thi hơn một chút. – codeulike

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