问题
I am trying to store "dynamic" properties about objects in SQL. As an example, let's say I have a table called objs that has two columns (id, name). Now some users may want to store a property called hocus while others may want to store a property called pocus (or even banana). Anything really.
My thought is to create two tables, props and obj_props. props would have two columns (id and prop_name), and obj_props would have (obj_id, prop_id, and value).
My only concern is this seems like a lot of overhead if there are millions of objects, each with 20-30 properties. I know I could create an index in obj_props on obj_id and prop_id but will this still be able to perform well? Is there a better solution for something like this? I'm looking into MongoDB but the lack of joins is frustrating.
回答1:
This has been discussed repeatedly before:
- This DBA.stackexchange.com post
- Dynamic table columns based on user preferences
- Should I place EAV values in a datatype table?
- How to represent many similar attributes of an entity in a database?
- Database design - should I use 30 columns or 1 column with all data in form of JSON/XML?
- What is the maximum number of columns in a PostgreSQL select query
The short version: EAV has its place, but it's often better to use json, XML, or hstore. PostgreSQL 9.4's enhanced json will probably become the most attractive choice, as it combines the advantages of json and hstore.
回答2:
First, you should start with a proper database schema (using standard data model patterns) so you can avoid this as much as possible.
Martin Fowler recommends using either a serialized LOB (such as JSON or XML), or allowing the user to edit their own database schema (which is my preferred method):
http://martinfowler.com/bliki/UserDefinedField.html
Bill Karwin has a post somewhere on creating a second table to index values in the blob field, but I can't find it right now. Will post when I do.
来源:https://stackoverflow.com/questions/21414092/storing-dynamic-properties-of-objects-in-sql