Моделирование отношений "многие ко многим" в хранилище данных

Я должен спроектировать модель хранилища данных и процесс ETL для класса в моем университете. В моем хранилище данных должны храниться мнения / комментарии о продукте, каждая запись должна состоять из:

  • текст комментария (строка)
  • оценка продукта ({0, 0,5, …, 4,5, 5})
  • комментарий автора (String)
  • дата комментария (Date)
  • рекомендация продукта ({Да, Нет})
  • комментировать голоса (Int)
  • комментарий вниз голосов (Int)
  • Плюсы продукта (много строк, например, {цена, дизайн, долговечность, … }) и их количество
  • минусы продукта (много строк, например {слишком громко, слишком тяжело, цена, … }) и их количество

Дополнительно в хранилище данных должна храниться информация о товаре:

  • Категория продукта
  • марка продукта
  • модель продукта

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

Сначала я рассматриваю 3 подхода, которые я представил на диаграмме ниже. Я использовал метод таблицы мостов (хотя я не знаю, правильно ли), чтобы избавиться от отношений "многие ко многим". Я не знаю, как это повлияет на производительность запросов.

ER модель

Второй подход, который я могу использовать, это метод логических столбцов. В таблице PROS и CONS я могу создать столбец для каждого возможного значения, но может быть до 100 различных плюсов и минусов. Также количество возможных плюсов или минусов не является постоянным во времени. Авторы в своих комментариях могут перечислить новые плюсы и минусы (вот как это работает в источнике данных), но я не могу добавить новые столбцы (я не должен изменять данные в хранилище данных).

Третий подход, который я рассматриваю, заключается в том, чтобы сохранить плюсы в таблице PROS, но в 1 столбце, где значения будут разделяться запятыми или каким-либо другим разделителем, например "цена, дизайн, цвет". Это делает вещи простыми, но сложными для анализа или нарезки кубиками.

Какой подход я должен использовать в этой ситуации? Что лучше для загрузки данных в хранилище данных, потому что из источника данных формы я получу все комментарии и хочу загружать только те комментарии, которые были новыми с момента последней загрузки?

1 ответ

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

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

  • Вы можете удалить таблицу pros_Bridge, которая содержит только количество. вы можете добавить этот столбец к вашей таблице фактов COMMENT, которая у вас там есть. Это было бы более эффективно и легко, когда дело доходит до запросов, а не запросов во многих таблицах.
  • Вы сказали, что у вас есть много областей, чтобы дать плюсы, такие как цена, дизайн, долговечность и т.д.
  • Добавьте новый столбец в таблицу Pros_Bridge_Detail для хранения идентификатора вновь созданного измерения, в котором содержатся типы продуктов (дизайн, долговечность и т. Д.). Теперь, как только вы добавите продукт Pro, таблица Pros_Bridge_Detail будет иметь плюсы, которые дает пользователь, а также будет содержать значение относительно того, что профи предоставляется через идентификатор нового измерения.
  • Также не забудьте сохранить идентификатор комментария в таблице Pros_Bridge_Detail, поскольку это будет ваша ссылка (FK) на таблицу фактов комментариев, которая у вас есть.

То же самое можно сделать и с минусами.

Надеюсь, вы понимаете, что я только что объяснил, и надеюсь, что это поможет. сообщите, если у вас есть какие-либо проблемы.

Другие вопросы по тегам