создать функцию для задачи или для транзакции в API библиотеки? - PullRequest
0 голосов
/ 01 ноября 2018

В моем приложении я создаю библиотеку для постов (точно так же, как посты в Facebook), с каждым постом может быть связано несколько тегов, и пользователи также могут видеть посты по тегам, поэтому у меня есть 2 таблицы: -

"posts_has_tags"
    post_id -> tag_id

"tag_has_posts"
    tag_id -> post_id

разработчик может запросить публикацию и тег, используя библиотеку, подобную этой ->

Post $post = new Post($postId)
Tag $tag = new Tag($tagId)

тогда я хочу добавить функции, которые будут прикреплять теги к посту, но теперь я в замешательстве, потому что я могу создать 2 отдельные функции, одну, которая добавляет теги к посту (в классе записей), а другую - добавить пост к тегу (в класс тега) например: первый: -

$post->addTags([$tag1, $tag2])
then 
for (i = 0; i < numOfTags; i++){
    $tag{i}->addPost($post)
}

так что здесь разработчики (пользователь библиотеки) будут иметь 2 функции, им придется вручную добавлять теги к записи, а также добавлять эту запись к тегу, поэтому, если вторая операция завершится неудачно (если эти таблицы находятся на отдельных машинах), они могут откатить первую операцию,

или

Я могу просто предоставить одну функцию в классе Post, которая будет делать все автоматически, например: -

$post->addTags([$tag1, $tag2...])

Итак, какой подход лучше? Предположим, что моя база данных защищена функцией (средние таблицы post_has_tags и tag_has_posts могут находиться на разных компьютерах), поэтому при первом подходе пользователь библиотеки может создать распределенную транзакцию на уровне приложения, если произойдет сбой второй машины. , мы можем откатить первую операцию с помощью функции removeTags (), а во втором случае это должно быть сделано на уровне библиотеки,

я хочу знать, какой из них лучше?, То же самое относится к подписчикам, где вы можете видеть подписчиков и подписчиков, и эти вещи также могут быть на разных машинах, извините за слабый английский, спасибо:)

1 Ответ

0 голосов
/ 01 ноября 2018

Чаще всего это делается с одной таблицей, которая будет иметь что-то вроде ...

table: postAssciatedTags
columns:  postID,
          tagID,
          taggedDate (optional)

с первичным ключом postID и tagID (так как вы можете пометить сообщение только один раз одним и тем же тегом).

Таким образом, вы добавляете только одну запись, которая является двунаправленной, вы можете видеть, какие теги имеют сообщения или какие сообщения помечены определенным тегом.

...