Как правильно реализовать два разных типа поста с различными доп. полями?

Пишу проект, в котором существует всего две категории (они же могут быть просто одним из видов постов). Для постов данных категорий существует два разных набора дополнительных полей. Возникает вопрос, как правильно реализовать это?

Есть два варианта, которые сразу лезут в голову:
1. Создать стандартную модель Post, в которой будут данные для постов обоих категорий, и таблицу, например, post_meta, в которой я бы указывал: post_id, meta_name, meta_value (как это сделано в Wordpress).
2. Сделать интерфейс Post, создать две модели под посты каждой категории и для этих моделей определять наборы кастомных полей, которые будут являться соответствующими полями таблицы базы данных. Этот вариант не нравится мне из-за отсутствия расширяемости, то есть если мне потребуется создать (не факт, но все бывает), третий тип постов, со своими кастомными полями, то придется снова создавать отдельную модель. Такая же проблема будет и при добавлении новых кастомных полей в существующие модели, так как придется добавлять эти поля в качестве столбцов таблицы в БД.

Как это реализуется в нормальных проектах? Интересует только алгоритм.
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Одна общая таблица с постами и их айдишками
По дополнительной таблице с доп полями под конкретные случаи, которые ты будешь джоинить (есстественно по-нормальному для этого нужен какой-то пакет, релейшены не к месту).

Поля в доп таблице могут иметь айди поста как primary key без проблем, своя айдишка им не нужна.

json поле типа meta - тоже вариант, но он медленней. Если выборки и связи не нужны или не особо нужны, то это вообще отличный вариант.

Отдельная таблица meta_name и meta_value - это вообще худший из худших вариантов. Ни плюсов отдельных таблиц, ни какого-то профита над обычным json полем (потому что если тебе сильно нужны выборки, то отдельные таблицы дают тебе типы, нормальную индексацию, нормальные констреинты, форейны и прочее, а если не нужны - то json тупо проще отдельной таблицы). Выбирай из двух вариантов выше.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы