Я разработчик программного обеспечения. Мне нравится кодировать, но я ненавижу базы данных... В настоящее время я создаю веб-сайт, на котором пользователю будет разрешено отмечать объект как понравившийся (например, в FB), пометить его и комментарий.
Я зациклился на дизайне таблиц базы данных для работы с этой функциональностью. Решение тривиально, если мы можем сделать это только для одного типа вещей (например, фотографий). Но мне нужно включить это для 5 разных вещей (на данный момент, но я также предполагаю, что это число может расти, поскольку весь сервис растет).
Здесь я нашел несколько подобных вопросов, но ни один из них не имеет удовлетворительного ответа, поэтому я снова задаю этот вопрос.
Вопрос заключается в том, как правильно, эффективно и эластично разрабатывать базу данных, чтобы он мог хранить комментарии для разных таблиц, любит разные таблицы и теги для них. Некоторые шаблоны проектирования в качестве ответа будут лучше;)
Подробное описание:
У меня есть таблица User
с некоторыми пользовательскими данными и еще 3 таблицы: Photo
с фотографиями, Articles
со статьями, Places
с местами. Я хочу, чтобы любой зарегистрированный пользователь:
-
комментарий к любой из этих трех таблиц
-
отметьте любой из них как понравившийся
-
пометить любой из них некоторым тегом
-
Я также хочу подсчитать количество понравившихся для каждого элемента и количество раз, когда использовался этот тег.
1 st подход:
a) Для тегов я создам таблицу Tag [TagId, tagName, tagCounter]
, тогда я создам таблицы отношений "ко многим ко многим" для: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) То же самое относится к комментариям.
c) Я создам таблицу LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Количество понравившихся будет рассчитываться по запросам (что, я полагаю, плохо). И...
Мне действительно не нравится этот дизайн для последней части, он плохо пахнет для меня;)
2 nd:
Я создам таблицу ElementType [idType, TypeName == some table name]
, которая будет заполнена администратором (мной) с именами таблиц, которые могут понравиться, прокомментировать или отметить. Затем я создам таблицы:
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
и то же самое для комментариев и тегов с соответствующими столбцами для каждого. Теперь, когда я хочу сделать понравившуюся фотографию, я буду вставлять:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
и для мест:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
и т.д. Я думаю, что второй подход лучше, но я также чувствую, что в этом дизайне нет чего-то...
Наконец, я также задаюсь вопросом, какое лучшее место для хранения счетчика для того, сколько раз понравился элемент. Я могу думать только о двух путях:
- в элементе (
Photo/Article/Place
) table - выбрав count().
Надеюсь, что мое объяснение проблемы более основательно.