Я создаю таблицу, позволяющую пользователям сайта стать друзьями. Я пытаюсь определить, который является лучшим дизайном таблицы для хранения и возвращения друзей пользователя. Цель состоит в том, чтобы иметь быстрые запросы и не использовать много пространства db.
У меня есть два варианта:
Имеют отдельные ряды для каждой дружбы.
+----+-------------+-------------------+ | ID | User_ID | Friend_ID | +----+-------------+-------------------+ | 1 | 102 | 213 | | 2 | 64 | 23 | | 3 | 4 | 344 | | 4 | 102 | 2 | | 5 | 102 | 90 | | 6 | 64 | 88 | +----+-------------+-------------------+
Или сохраните всех друзей в одной строке как CSV
+----+-------------+-------------------+ | ID | User_ID | Friend_ID | +----+-------------+-------------------+ | 1 | 102 | 213,44,34,67,8 | | 2 | 64 | 23,33,45,105 | +----+-------------+-------------------+
При поиске друзей я могу создать массив с помощью функции explode()
однако удаление пользователя было бы сложнее.
Изменить: для второго метода я бы разделил каждый id в массиве в php для таких функций, как подсчет и другие.
Какой метод, по вашему мнению, лучше?
Первый метод определенно лучше. Это то, что делает реляционные базы данных отличными 🙂
Это позволит вам искать и группировать по гораздо более конкретным критериям, чем второй метод.
Скажите, что вы хотели написать запрос, чтобы пользователи могли видеть, кто у них был как друг. Второй метод потребует от вас использовать IN () и будет намного медленнее, чем просто использовать JOINS.
Первый метод лучше всего во всех отношениях. Мало того, что вы будете использовать индексы БД, чтобы быстрее находить записи, это значительно упростит внесение изменений.
Нарушение первой нормальной формы обычно нежелательно, поскольку
Используйте силу реляционной базы данных. Определенно идти с первым подходом. MySQL быстрее, чем вы думаете, и он регулярно занимается ОЧЕНЬ большими наборами данных.