0

Рассмотрите маршрут поездки. В гастроли можно остановиться на 20 возможных. Стандартный тур включает остановки с 1 по 20 по порядку. Однако каждый пользователь может создать свой собственный тур, состоящий из 5 или более остановок в любом порядке с возможностью повторов. Каков наиболее эффективный способ моделирования этого в базе данных?Схема проектирования базы данных для нескольких больших списков

Если мы используем таблицы объединения
user_id, stop_id, order
мы имели бы миллионы записей очень быстро, но мы могли бы легко вытащить стопор & атрибутов пользователя на запросы.

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

Существуют ли другие возможности, позволяющие получать доступ к родительским атрибутам при минимизации размера таблицы?

+1

не хранить как массив. он побеждает цель использования реляционной базы данных, которая заключается в ** RELATE ** данных. «большие» таблицы не проблема. есть много dbs с таблицами с миллиардами/триллионами записей. –

ответ

1

Вы думаете, что экономия места поможет вам. Это не так. Также можно утверждать, сколько места вы фактически сохранили.

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

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

TL; сохранить нормализовано.

1

Размер базы данных является приоритетом примерно Процент процентов времени. Простота доступности данных: приоритет приблизительно каждый процент времени.

2

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

users table 
tours table 
stops table 
tours_users table (a User can go to a Tour more than once) 
stops_order table: stop_id, order, tours_users_id 

Для запроса таблицы, для любого пользователя, который вы хотите проверить свои вы можете достичь этого с помощью таблицы tours_users, если необходимо восстановить стопы, вы можете легко соединить таблицу tours_users с таблицей stops_order через tours_users_id.

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

+0

Что было бы полезно для таблицы 'stop_order' в сравнении с столбцом' order' на таблице 'tour_users'? – csi

+0

Вы предлагаете иметь одну таблицу с 'tour_id, user_id, stop_id, order', которая решает проблему, которая у вас есть, но вы получаете много избыточности в данных. имея 5+ записей для каждого 'user/tour', вытягивая из него что-то вроде« туров на пользователя », каждый раз на огромном наборе данных было бы так дорого в долгосрочной перспективе. – Rabea

+1

Извините, не было ясно. Нам не нужен стол для туров. Нужны 'users_table',' stops_table', 'user_stops_table'. В 'user_stops_table' мы имеем' user_id', 'stop_id',' order'. У каждого пользователя может быть только 1 тур. – csi