|
|
|
Проектирование БД, реальная ситуация
|
|||
|---|---|---|---|
|
#18+
Добрый день Сейчас разрабатываем проект для одной крупной туристической компании. База данных MS SQL Server 2005. Проект - веб сайт для поиска и покупки путевок, бронирования отелей, билетов на самолет, машин на прокат и т.д. Одна из задач проекта - поиск продукта. Будем считать, что поиск - это поиск по одному продукту. Информация о всех поисках должна быть сохранена в базу. Информация для каждого поиска состоит из множества элеметов как общих для всех продуктов (например с какого по какой день бронируется продукт, количество результатов вернувшихся при поиске и т.д.), так и специфичных для каждого продукта (например желаемый тип коробки передач в машине). Чтение из базы данных это в основном ежедневная выгрузка в OLAP хранилище для последующей обработки, но изредка по данным о поисках будет необходимо запустить ad-hoc запрос для какого-то срочного репорта который может объединять несколько продуктов и его нельзя сделать в OLAP. Количество данных - около сотни миллионов поисков. Ну, а теперь вопрос, как все это лучше организовать в базе данных? Пока вижу три варианта: 1. Создать таблицу с общими параметрами для продуктов и к ней по связке один к одному привязать таблицы с параметрами специфичными для продуктов. Т.е. например ищем машину. Тогда создается 2 записи, одна в таблице Search с общими для всех продуктов параметрами (с какого по какое число бронируется машина) и одна в CarSearch со специфичными (тип коробки передач) 2. Свалить все данные в одну таблицу, но тогда поля типа "тип коробки передач" будут лишним при записи информации о поиске билетов на самолет например. 3. Свалить все данные в одну таблицу, но для специфических параметров сделать типизированное xml поле. В этом случае все поля используются всегда, но как я понимаю могут тормозить ad-hoc запросы, т.к. для них надо будет парсировать xml в каждой записи. Коллеги, поделитесь опытом кто как решает подобные задачи. Из 3-х вариантов приведенных выше 1 и 3 выглядят более или менее. Еще одна проблема - добавление новых параметров поиска. Например мы решили дать клиенту возможность искать машину определенного цвета. В этом случае в вариантах 1, 2 надо добавить колонку в таблицу, а в варианте 3 изменить схему привязанную к xml полю. В обоих вариантах при 100 млн записей (параметров много, так что записи большие по размеру) сервер запарится и надолго обновлять изменяемую таблицу. Можно ли этого как-то избежать? Огромное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2011, 10:27 |
|
||
|
Проектирование БД, реальная ситуация
|
|||
|---|---|---|---|
|
#18+
Docker3. Свалить все данные в одну таблицу, но для специфических параметров сделать типизированное xml поле. В этом случае все поля используются всегда, но как я понимаю могут тормозить ad-hoc запросы, т.к. для них надо будет парсировать xml в каждой записи. 4. Свалить все в одну таблицу (общие для всех типов продуктов данные), для разных типов продуктов создавать новые таблицы. Новые таблицы связаны с главной по ключевому полю. Получаем количество таблиц 1 + N, где N - количество типов продуктов. 5. Свалить все в одну таблицу (общие для всех типов продуктов данные), сделать в добавок в этой таблице запасные доп. поля, например N1, N2, .. N20, S1, S2, ..., S20. К примеру, N - для числовых данных, S - для строковых. Для каждого типа продукта определится в какие поля чего будет записыватся. Заранее определится оптимальное количество запасных полей и ими пользоватся. И в том и другом случае можно построить индексы на поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2011, 11:12 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37114542&tid=1542316]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
386ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
31ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 657ms |

| 0 / 0 |
