Hi Wayne,
I've done a few implementations like this, and generally my suggestion is that it is better to adjust your CRM to the vcard/iCalendar data-model then to try do to the opposite, as you will always have an inferior datamodel from what iCalendar/vCard offers.
When customers don't want to do this, I tend to tell them that it's a risk for them to take as mapping to an inferior model means that you lose information, and I don't know how clients behave in those cases.
Another possibility is to maintain both data-models, and when a user uses your CRM system and for example updates a contacts email address, your code goes into sabre/dav and _also_ updates the associated vcard. In that scenario you basically end up with 2 datamodels that keep each other in sync when they are updated.
But yea, I've also seen customers who do actually have a translation layer between their data-model, implementing custom backends. The question you need to ask though then, what if a CalDAV or CardDAV client sets a field that doesn't map to anything in your data-model? Do you discard it? For iCalendar this will be much, much harder than vCard, especially if you want to support timezones, recursion, exceptions or scheduling. For vCard I think it's more doable, but yes, you are not getting around storing the client-provided uris and UIDs. You're required to add that to your datamodel, although I can't see why that would be an issue.
Generally I would say that in an ideal world your CRM application treats sabre/dav as its data-store. That approach might also require you to learn more about sabredav internals in case your CRM needs to do operations that are not default.
Hope this helps!
Evert