Как лучше оформить таблицу транзакций?

Таблица пользователей

ИДЕНТИФИКАТОР COLUMN_1 COLUMN_2 COLUMN_3 И Т. Д... 348 ... ... ... ...

Таблица объявлений

ИДЕНТИФИКАТОР ID ПОЛЬЗОВАТЕЛЯ COLUMN_1 COLUMN_2 COLUMN_3 И Т. Д... 91 348 ... ... ... ...

Таблица транзакций

РАСХОДЫ КОЛИЧЕСТВО ДНЕЙ ДАТА СДЕЛКИ ТИП AD_ID ID ПОЛЬЗОВАТЕЛЯ 3000 НУЛЕВОЙ ... 1 НУЛЕВОЙ 348 -800 30 ... 2 НУЛЕВОЙ 348 -50 НУЛЕВОЙ ... 3 91 348 -300 19 ... 4 91 348

Есть 4 типа сделок

  • 1 = Когда пользователь добавляет деньги в свой кошелек.
  • 2 = Когда пользователь покупает золотой статус.
  • 3 = Когда пользователь делает репост своего объявления. (Объявление снова появится вверху списка)
  • 4 = Когда пользователь делает свое объявление избранным. (Объявление будет отображаться над нерекламными объявлениями)

Мне не нравится проектировать таблицу транзакций таким образом, потому что есть столбцы, которые не требуются в соответствии со значением типа. Есть ли лучший способ спроектировать таблицу транзакций?

Вопрос, вероятно, привлечет ответы, основанные на мнении. Я предпочитаю хранить все транзакции в одном месте и жить с избыточностью.

P.Salmon 22.11.2022 10:00

@P.Salmon У меня есть таблица уведомлений с 28 типами, и таблица уведомлений разработана так же, как таблица транзакций. Как вы думаете, дизайн моих таблиц хорош?

Taha Sami 22.11.2022 10:13

«Хорошо» по определению основано на мнении. Как мы должны оценивать «хорошо»? Каковы характеристики «хорошего» дизайна в вашем случае?

Neville Kuyt 22.11.2022 10:17

@NevilleKuyt Все работает хорошо на стороне клиента, но я спрашиваю здесь, потому что, возможно, есть лучший способ спроектировать таблицу, чем текущий способ, я ненавижу этот дизайн только потому, что в соответствии со значением типа будут использоваться некоторые столбцы, а некоторые не будет. Я думаю, что NoSQL решит эту проблему.

Taha Sami 22.11.2022 10:26
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это пример отображения отношений наследования («существует 4 типа транзакций») на модель реляционной базы данных. TL;DR: элегантных решений не существует — вам нужно выбрать ту неэлегантность, которую вы хотите. Есть 3 распространенных подхода.

Ваш дизайн является примером «наследования одной таблицы». С ним проще всего работать — другие варианты включают добавление таблиц в дизайн с необходимостью объединения — но для этого требуются столбцы, которые не всегда заполнены. Это также отправляет проверку объекта на прикладной уровень — вы не можете создать DDL, чтобы гарантировать, что AD_ID is not null для сущностей типа 1 и 2.

Другие вопросы по теме