Шаблон проектирования: Как структурировать таблицы в БД, чтобы: Ограничить доступ к статьям на сайте только подписанным пользователям? - PullRequest
1 голос
/ 07 апреля 2020

Это мой первый вопрос по stackoverflow. Поэтому, пожалуйста, прости, если он не соответствует стандартам:

ИСПОЛЬЗОВАННАЯ БАЗА ДАННЫХ: PostgreSQL v11.2

Я создаю реакцию. js приложение для показа статей для зарегистрированных пользователей. Этими пользователями могут быть: (i) тех, кто подписался на один из планов подписки, или, (ii) просто вошли в систему и просматривали, но еще не подписались. (ЭТА ЧАСТЬ УПРАВЛЯЕТСЯ - НИКАКОЙ ПРОБЛЕМЫ ЗДЕСЬ)

Статья может принадлежать к разным "категориям". (ЭТА ЧАСТЬ УПРАВЛЯЕТСЯ - НИКАКИХ ПРОБЛЕМ ЗДЕСЬ)

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

Я хочу создать структуру базы данных, которая будет обрабатывать эту видимость в зависимости от того, подписан пользователь или нет.

  • USER столбцы таблицы (что важно): идентификатор, имя, is_subscribeed (логическое значение)

  • CATEGORY столбцы таблицы (что важно): id, cat_name

  • ARTICLE столбцы таблицы (что важно): идентификатор, заголовок

  • ARTICLE_CATEGORY столбцы таблицы: id, article_id, category_id

  • SUBSCRIPTION столбцы таблицы: id, имя_плана, цена, описание

Как go опередить его? Я еще не построил структуру, чтобы реализовать это.

ЧТО ДОЛЖЕН БЫТЬ ЛУЧШЕГО ПОДХОДА?

(1) Должен ли я сделать это на уровне категории / статьи? Например: таблицы «ARTICLE_CATEGORY» и «ARTICLE» будут содержать логический столбец «subs_only».

ИЛИ

(2) Должен ли я вести отдельную таблицу, связывающую мои планы подписки с категориями / статьями?

Моя модель для ПОЛЬЗОВАТЕЛЯ выглядит следующим образом:

const User = sequelize.define("user", {
    full_name: { type: DataTypes.STRING },
    email: { type: DataTypes.STRING },
    password: { type: DataTypes.STRING },
    email_verify_token: { type: DataTypes.STRING },
    is_email_verified: { type: DataTypes.BOOLEAN },
    is_subscribed: { type: DataTypes.BOOLEAN },
    ... <many more columns>
  });

Моя модель для SUBSCRIPTION_PLAN выглядит так:

const SubscriptionPlan = sequelize.define("subscription_plan", {
    plan_name: { type: DataTypes.INTEGER },
    price: { type: DataTypes.INTEGER }
    ... <many more columns>
  });

Моя модель для ПОДПИСЧИКОВ выглядит так:

const Subscriber = sequelize.define("subscriber", {
    user_id: { type: DataTypes.INTEGER },
    subscription_id: { type: DataTypes.INTEGER }
    ... <many more columns>
  });

Моя модель для ARICLE выглядит так:

const Article = sequelize.define("article", {
    title: { type: DataTypes.STRING },
    url: { type: DataTypes.STRING },
    display_pic: { type: DataTypes.STRING },
    ... <many more columns>
  });

Моя модель для ARICLE_CATEGORY выглядит так:

const ArticleCategory = sequelize.define("article_catgeory", {
    article_id: { type: DataTypes.INTEGER },
    category_id: { type: DataTypes.INTEGER }
    ... <many more columns>
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...