0

У меня есть база данных с несколькими арендаторами со строгим и критичным разделением данных между клиентами. Прежде чем приступить к производству, я хотел бы знать, имеет ли смысл мой подход или может привести к проблемам в будущем (безопасность/производительность/обслуживание). Ниже 2 модели типичный сценарий:Как обращаться с ClientId в базе данных с несколькими арендаторами

public class Car 
{ 
    [Key, Column(Order=0)] 
    public int carId {get;set;} 

    [Key, Column(Order=1)] 
    public int clientId {get;set;} 

    ... 

    public virtual ICollection<Component> components {get;set;} 
} 

public class Component 
{ 
    [Key, Column(Order=0)] 
    public int componentId {get;set;} 

    [Key, Column(Order=1)] 
    public int clientId {get;set;} 

    ... 

    [ForeignKey("carId, clientId")] 
    public Car car {get;set;} 
    public int carId {get;set} 
} 

Таким образом, каждая модель имеет ClientId как первичный ключ, заставляя его использовать с .find(), заставляя его в Join-таблицы для многих многих отношений , Это означает, что существует довольно много избыточности, и clientId используется, когда запрос действительно достаточно безопасен для разделения данных.

Имеет ли смысл принуждать клиента к чему-либо, или может быть лучше сохранить его только на родительских моделях?

+0

clientId как первичный ключ? или его внешний ключ? –

+0

В приведенном выше коде clientId формирует составной ключ вместе с фактическим свойством id. Но это то, с чем я борюсь. Включите его в составную PK и заставьте его в запросах в качестве дополнительной «проверки» или сохраните ее и используйте только на родительских моделях. Особенно безопасность - это проблема. Я не вижу последствий в будущем, потому что у меня нет опыта. –

+0

Почему бы не использовать арендатора по схеме? –

ответ

1

Это мое мнение, что это правильный путь. Мы разработали с клиентом только по патентным таблицам и с тех пор перешли на денормализацию его на различные дочерние таблицы. Это означает, что он может использоваться в запросах, вызванных дочерней таблицей. Это также позволяет нам разбивать таблицы клиентом.

1

Если бы я разрабатывал это, я бы удостоверился, что код приложения, который управляет базой данных, тщательно протестирован и написан в высоком качестве и добавляет избыточность таким образом.

Добавление избыточности таким образом сделает ваш код и базу данных более сложными для управления, и я думаю, это может привести к проблемам с производительностью тоже (у меня недостаточно информации, чтобы претендовать на твердую позицию, но это похоже на нее).

+0

Резервирование - это дополнительное целочисленное поле для всех дочерних таблиц, а также 2 дополнительных целых числа в таблицах соединений. Так что это все еще управляемо, но оно есть. –

Смежные вопросы