Ok, now we are getting closer.
So only the contact object will allow custom fields? What about custom objects relating to the standard contact object? Funny, I am working on a similar idea.
I'll go with what you've said for now.
From a database architectural standpoint, you will need some form of tenancy descriptor or metadata and this will need to be centralized. Centralizing is always something that fights against scale, but just for the tenancy metadata, the overhead isn't too bad. So, now that you can retrieve the "tenant" metadata, you need to decide how to store and retrieve each tenant's own data. That could be at database level (1 database per tenant), class level (some prefix key in the names of each class, for instance), or at the record/vertex level with a property field holding the tenant key. All choices have advantages and disadvantages. I am not entirely sure about them in an OrientDB system either. However, for us, since we decided to go with a database per tenant, it doesn't matter. Your use case might vary.
So, aside from your decision on tenancy control, you must also contend with the custom fields. I believe the only way to do this effectively in any document storage is to use key/ value pairs as subdocuments. Here an example.
customFields : [
{ k : "Customer's Maiden Name", v : "Miller" },
{ k : "Child's Full Name", v : "Christa Smith" },
{ k : "Child's Birth Date", v : 128998232389 },
{ k : "Home Phone", v : "+1-555-123-2345" } ]
There are inherent advantages and some disadvantages to this method of storing custom field.
Advantages:
1. You only need one index.
2. Querying shouldn't be too hard.
3. The fields and field types can be freely created without a lot of issue on schema. You also aren't limited to 20. You can allow 100s.
Disadvantages:
1. You must also keep some form of metadata (mapping) of the fields for each tenant somewhere, so you know what it is they are storing and retrieving and can display it properly. (this is actually unavoidable anyway).
2. You have more data in the DB than is actually needed, bloating it up a bit (all the k and v field names)
3. Creating queries to insert and update gets more complicated.
The multilingual part can mean two things. The application text i.e. field names, need translation or the actual content (the field values) need translation. This is a bit more tricky. For the field names, I'd centralize/ normalize them too. And for the content, you could have multiple subdocuments with the translated values, when they need translation. Which values are translated or not would be metadata again.
How this all actually fits best or if it fits best in this form in OrientDB is something I am still working on myself.
Hope that helps.
Scott