Я занимаюсь разработкой платформы для обмена фотографиями. Приложение позволяет опубликовать фотографию, а другие могут понравиться или оценить фотографию. Пользователи могут следить друг за другом и видеть фотографии, которыми делятся их «подписчики», как Instagram.
#user_tbl
id | name | number
-------------------
1 | Dan | 0209
2 | Sam | 2854
3 | Dave | 8123
4 | Alex | 5600
#photo_tbl
id | userid | path
-------------------
1 | 3 | dave-dog.jpg
2 | 1 | dans-cat.png
3 | 4 | alex-bird.jpg
4 | 2 | sam-fish.jpg
#friendship_tbl
id | actor | target
--------------------
1 | 2 | 1 // Sam is following Sam
2 | 2 | 4 // Sam is following Alex
3 | 1 | 3 // Dan is following Dave
4 | 4 | 2 // Alex is following Sam
#activities_stream_tbl
id | photoid | userid | context | date
----------------------------------------------------------
1 | 3 | 4 | add-new-photo | 10/10/2015
2 | 1 | 3 | add-new-photo | 12/10/2015
3 | 3 | 2 | Sam-share-Alex-photo | 15/10/2015
4 | 4 | 2 | add-new-photo | 20/10/2015
6 | 1 | 1 | Dan-like-Dave-photo | 21/10/2015
#User_table содержит основную информацию о пользователе, в то время как #photo_tbl
держать имя и путь к фотографии, предоставленной пользователем. в #friendship_tbl
это связь между пользователями. "actor"
столбец — это идентификатор пользователя, который делает следующее, пока "target"
столбец — это идентификатор пользователя, за которым следят.
У меня сейчас проблема с написанием строки запроса, чтобы вытащить фотографии USERX
и фотографии других пользователей USERX
отслеживает и группирует их по «photoid» в activity_stream_tbl и ORDER BY «date» activity_stream_tbl.
Я буду рад, если кто-нибудь сможет мне помочь, покажите мне лучший способ структурирования БД, спасибо.
чтобы вытащить фотографии USERX, вы можете построить свой SQL как
select PATH
from user_tbl as a inner join photo_tbl as b
on a.id = b.user_id
and a.name = 'userx'
и вытащить фотографии других пользователей, за которыми следит USERX, можете написать
select path
from photo_tbl as a
where a.userid in (select target from friendship_tbl as x inner join user_tbl as y on x.actor = y.id and y.name = 'user')
Вы можете объединить два приведенных выше результата, если хотите.
например:
select PATH
from user_tbl as a inner join photo_tbl as b
on a.id = b.user_id
and a.name = 'userx'
UNION
select path
from photo_tbl as a
where a.userid in (select target
from friendship_tbl as x
inner join user_tbl as y
on x.actor = y.id and y.name = 'user')
Других решений пока нет …