1

Мне нужно знать, каковы компромиссы использования денормализованной таблицы и использования двух отдельных таблиц и доступа к данным с помощью объединений. Я использую Entity Framework 4.Де-нормализовать таблицу или использовать Объединения в Entity Framework

В моем случае у меня есть две таблицы Order и OrderCategoryDetails. Я думаю, лучше ли слияние этих двух таблиц в одну таблицу?

  • Если денормализованной, добавленные столбцы (OrderCategory и OrderSubcategory будет будет разреженным (может быть 100% пуст. Всегда будет по крайней мере 50% пустой)
  • С другой стороны, если я держу его как это, я беспокоюсь о выполнении частых операций объединения (т.е. всякий раз, когда я запрашиваю конкретный Order, мне нужна информация от OrderCategoryDetails.

В настоящее время у меня есть нормализованные таблицы и использовать навигационные свойства:

  • Чтобы получить доступ к информации заказа Категории от экземпляра OrderItem

    OrderItem orderItem = _context.OrderItems.Where(...).FirstOrDefault(); 
    if(2 == orderItem.SalesOrder.Category.OrderCategory){ ...} 
    
  • Чтобы получить доступ к информации заказа Категории из Номер экземпляра

    Order order = _context.Orders.Where(...).FirstOrDefault(); 
    if(2 == order.Category.OrderCategory){ ...} 
    

Это моя схема:

Таблица: Заказать

  • ID (первичный ключ)
  • Дата
  • Сумма
  • ITEMCOUNT
  • OrderCategoryInfo (FK - присоединиться к OrderCategoryDetails на OrderCategoryDetails.ID)

Таблица: OrderCategoryDetails

  • ID (первичный ключ)
  • OrderCategory
  • OrderSubCategory

Таблица: OrderItem

  • OrderItem ID (первичный ключ)
  • Order ID (FK - Соединение с Order)

базы данных используется: SQL Server 2008 R2

+2

«Меня беспокоят частые операции по объединению». , , Означает ли это, что вы не создали таблицы, загрузили образцы данных и протестировали их? –

+0

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

+0

Задайте себе вопрос, требует ли каждый заказ OrderCategoryDetail? Если ответ «да», тогда вам может быть лучше отменить нормализацию данных. Если ответ будет отрицательным, вам, вероятно, лучше держать его как отдельный стол. –

ответ

5

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

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

Основываясь на ваших ответах в комментариях, я бы рекомендовал вам разделить таблицы и установить связь между ними.

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

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