I will start with some general rules. When thinking DDD, you should reject any thoughts about saving (tables and primary keys, etc.). You must create your aggregate roots and entities as if you saved them in a file. When you develop models, if you think about tables or ORMs, you will not be able to do DDD; take a step back and restart.
As I can see, you started OK by dividing your models into a limited context. If you do not divide them into BC, you will get giant models that try to cover all the behavior, and then persistence will affect performance, because in DDD aggregates are stored in one transaction. One more thing, try to avoid inheritance and use of composition.
Speaking, let's talk about your business. In Authentication BC, there is a User that can authenticate with some credentials. Store BC has Customers who buy things. Invoice BC also has Customers , but a different model (if you need a different class). Shipping BC also has Customers , but again, a different model. These Customer models share some properties along BC, such as name and id . Thus, you use id to identify a person from real life, but use different models to encapsulate your behavior depending on the context.
I think that you should not have AbstractStoreCustomer , you should have only Customer and try to highlight what distinguishes them in the abstract class / interface, for example BuyingHistoryProfile with 2 implementations of FirstTimeCustomer and RecurrentCustomer . This class should only contain behavior regarding the purchase profile, and should be referenced by each Customer in Store BC. Similarly, try extracting a class in Invoicing BC to calculate the price.
Now that we have created the models, we can think of perseverance. For each limited context, create a Customer table that contains common properties ( name and id ) and specific properties ( BuyingHistoryProfile for Store BC, priceCalculationStrategy for Invoicing BC, etc.).
If you are wondering if there is a degree of data duplication, then you are right, but this is normal, you need to separate the models. This duplicate data is synchronized when User in Authentication BC changes its name: you update all other models at once. From this point of view, Invoice and Store BC are downstream; they use data from Authentication BC; it depends on your business when you upgrade.
As a fan of event-driven architecture, I recommend you take a look at CQRS (and even Event Sourcing). I think these architectures fit well in this application. CQRS can make your models 10 times cleaner, I will tell you from my experience. With Event Sourcing, it is very likely that you do not even have to use ORM . You can use the ORM on the read side if you really like them, or you cannot leave them. I personally do not like (and do not use) ORM s.