2013-07-18 2 views
2

До сих пор все, что я настроил, это таблица для пользователей, где каждый пользователь имеет уникальный user_id. Однако мне нужно сохранить список контактов для каждого пользователя. Это должно было содержать только user_id каждого контакта. Тем не менее, я столкнулся с проблемой дизайна.Как создать базу данных, в которой есть много пользователей, и у каждого есть список нескольких контактов?

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

Или я должен создать одну таблицу с двумя столбцами, user_id и contact_id, глядя что-то вроде этого:

 
------------------------------------ 
| user_id (INT) | contact_id (INT) | 
------------------------------------ 
| 10001  |  9945  | 
| 10001  |  2239  | 
| 10002  |  9636  | 
------------------------------------ 

Я боюсь, что если я пошел с вторым вариантом, отсутствием уникальной индексации а чистый размер таблицы в конечном итоге составит даже SELECT * FROM contacts WHERE user_id=10001;, потому что каждая запись должна повторяться каждый раз.

Каков наилучший способ организовать эти данные?

ответ

3

Единый нормализованный стол абсолютно правильный подход.

Вы беспокоитесь о его производительности из-за беспокойства о «отсутствии индексации».

Отсутствие индексирования? Почему отсутствие индексации?

Сделайте свой первичный ключ (user_id,contact_id) —, который имеет смысл семантически «все» —, и это все, что вам нужно.

Никогда, имеют переменное количество таблиц. «Таблица для каждого пользователя» - это когда вы загружаетесь из моей команды. ;)

+0

согласился с тем, что никогда не имеет переменного количества таблиц! – amaster

+0

Только для целей обучения первичный ключ будет уникальной комбинацией пользователя и контакта? Это так просто! Я понятия не имел, что первичные ключи могут охватывать несколько столбцов. Я новичок в этом. Спасибо! –

+0

@ CannonPalms: Там вы идете.:) Для записи, быть новым, на самом деле не является «оправданием», поскольку это упоминается в самой первой строке на [соответствующей странице руководства] (http://dev.mysql.com/doc/refman/5.5/en /optimizing-primary-keys.html). –

1

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

+0

Итак, таблица, содержащая контакты «start_index» для конкретного пользователя в таблице «контакты», где, когда контакт был добавлен или удален, индекс будет обновлен? –

+2

@CannonPalms: Er, no. Базы данных сделали это для вас с 1960-х годов. Посмотрите «индексы» в своем руководстве по MySQL. –

0

Я боюсь, что если я пошел с вторым вариантом, отсутствие уникальной индексации и сам размер таблицы в конечном итоге сделать даже SELECT * FROM контактов WHERE user_id = 10001; потому что каждая запись должна была бы повторяться каждый раз в течение .

Индекс User_id устранит эту проблему. Вместо того, чтобы повторять, он будет использовать алгоритмы поиска, которые хорошо работают даже по большому количеству записей. Кластеризованный индекс, если where user_id= является наиболее распространенным типом запроса, сделает производительность еще лучше.

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

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