Дизайн БД для "имеет много" проблема в таблицах против сохраненных списков - PullRequest
0 голосов
/ 27 октября 2009

Попытка выяснить, как лучше настроить «списки» коллекций для пользователей, используя следующие данные (псевдокод):

user table = id, name, email

cars table = id, make, model

user_cars table = user_id, car_id, rating

collections table = id, user_id, name

Факты

  • У пользователей может быть много машин

  • У пользователей может быть много коллекций

  • Отдельные машины могут быть во многих коллекциях

2 варианта, которые я вижу, чтобы позволить пользователю иметь список коллекций, это либо добавить поле к user_cars с именем collection_list и сделать содержимое этого поля списком запятых коллекций, которыми владеет пользователь, например : 1,30,400

или добавить дополнительную таблицу с именем collection_entries, которая содержит collection_id и car_id, каждая из которых указывает на свои соответствующие collection.id и cars.id. Возможная проблема, которую я вижу при добавлении другой таблицы, состоит в том, что число строк в этой таблице будет огромным. Например: 10 000 пользователей x 10 коллекций каждая x 100 автомобилей в коллекции = 1 миллион строк.

Идеи

Ответы [ 2 ]

1 голос
/ 27 октября 2009

Ваш второй вариант называется таблицей пересечений:

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

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

1 голос
/ 27 октября 2009

Если я правильно понимаю, у коллекции точно 1 владелец?

Итак:

users: user_id, name

cars: car_id, name

collection_cars: collectioncar_id, collection_id, car_id

collections: collection_id, user_id, name

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

...