Я создаю сайт, похожий на Yelp (механизм рекомендаций, но в меньшем масштабе), поэтому в системе будет три основных объекта: Пользователь, Место (включая предприятия) и Событие.
Теперь меня интересует, как хранить информацию, такую как фотографии, комментарии и «комплименты» (похожие на «Мне нравится» в Facebook) для каждого из этих типов объектов, а также для каждого объекта, к которому они могут быть применены (например, комментарий к рекомендации, фото и т. д.).Прямо сейчас, как я это делал, это была отдельная таблица для каждого, то есть
Фотография (id, type , owner_id , is_main и т. Д.))
где тип представляет: 1 = пользователь, 2 = место, 3 = событие
Комментарий (id, object_type, object_id , user_id, content и т. Д.и т. д.)
, где object_type может быть несколькими различными объектами, такими как фотографии, рекомендации и т. д.
Compliment ( object_id , object_type , compment_type, user_id)
где object_type может быть несколькими различными объектами, такими как фотографии, рекомендации и т. Д.
Activity (id, source, source_type , source_id и т. Д.) //for "activity feed"
где source_type - это пользователь, место или событие
Уведомление (идентификатор, получатель, отправитель, тип_операции, object_type , object_id и т. Д.)
, где object_type & object_id будет использоваться для предоставления прямой ссылки на объект уведомленияНапример, на фотографии пользователя, которая была отмечена
Но после чтения нескольких сообщений на SO, я понял, что яне может поддерживать ссылочную целостность с внешним ключом, поскольку для этого требуется отношение 1: 1, а мои поля source_id / object_id могут относиться к идентификатору в нескольких таблицах.Поэтому я решил использовать метод сохранения основного объекта, но затем разбить его на подмножества, например
User_Photo (photo_id, user_id) |Place_Photo (photo_id, place_id) |и т.д ...
Photo_Comment (comment_id, photo_id) |Рекомендация_Комментарий (comment_id, rec_id) |и т. д. *
Комплимент (id, ...) //would need to add a surrogate key to Compliment table now
Photo_Compliment (compment_id, photo_id) |Comment_Compliment (идентификатор_комментария, идентификатор_комментария) |и т. д. *
User_Activity (Activity_id, user_id) |Place_Activity (Activity_id, Place_id) |и т.д. ...
Я думал, что могу просто создать представления, соединяющие каждую вложенную таблицу с основной таблицей, чтобы получить желаемые результаты.Кроме того, я думаю, что это будет соответствовать моим объектным моделям в Code Igniter.
Единственная таблица, которую я могу оставить, - это таблица уведомлений, поскольку существует много типов объектов (сообщение на форуме, фотография, рекомендация).и т. д., и т. д.), и эта таблица в любом случае будет содержать уведомления только на неделю, поэтому любые проблемы с целостностью ссылок не должны быть большой проблемой (я думаю).
Так что я собираюсь сделать это разумнопуть?Любая производительность, надежность или другие проблемы, которые я мог упустить из виду?
Единственная «проблема», которую я вижу, состоит в том, что у меня будет много таблиц (так как сейчас у меня около 72, так что, думаю, я получу чуть менее 90 таблиц послеЯ добавляю дополнения), и, насколько я могу судить, это не проблема.
Очень благодарен за любые отзывы.Заранее спасибо.
РЕДАКТИРОВАТЬ : Просто чтобы быть ясным, я не беспокоюсь, если я в конечном итоге с еще 10 или около того таблиц.Из того, что я знаю, количество таблиц не является большой проблемой (если они используются) ... если вы не сказали 200 или около того: /