Как смоделировать мою базу данных для отношения «один ко многим»

#mysql #sql #django

#mysql #sql #джанго

Вопрос:

Я изучаю бэкэнд-разработку в Django и столкнулся с этой проблемой.

Допустим, я разрабатываю приложение для путешествий: у меня есть две базы данных USER и TRIP с отношением «один ко многим». т. Е. У каждого пользователя может быть несколько поездок, и каждая поездка может быть предпринята только одним пользователем.

У ПОЕЗДКИ есть столбец trip-number. Я хотел бы автоматически увеличивать этот столбец для каждой строки, добавленной в базу данных TRIP, НО приращение должно быть независимым для каждого пользователя, начиная с 1

Таблица ОТКЛЮЧЕНИЯ

пользователь номер поездки
1 1
2 1
1 2
1 3
2 2
3 1

Что-то в этом роде? Я не могу автоматически увеличивать весь столбец, так как он должен быть уникальным для каждой поездки, совершаемой пользователем, НО цифры могут быть одинаковыми у разных пользователей.

В идеале я предпочитаю делать это автоматически на стороне сервера (sql) вместо того, чтобы писать логику в клиенте. Любая помощь будет признательна. Спасибо

Комментарии:

1. Вы можете создать для него триггер при вставке / удалении, найти максимальное число для каждого пользователя и добавить к нему единицу для вновь добавленной записи. Но я бы не советовал использовать trigger. Вместо этого вы можете создать одно представление, в котором будет один дополнительный столбец для trip_number ..

2. Это то, что я делаю прямо сейчас. Для каждой вставки я фильтрую и получаю количество поездок для пользователя и увеличиваю его. Но я хотел посмотреть, есть ли лучший способ сделать это, а также я не упускаю ничего очевидного. Что вы подразумеваете под второй частью вашего заявления? В этой таблице есть другие столбцы, такие как source, destination и т.д., Выделение одного столбца trip_number и выделение его в отдельную таблицу не имеет никакого значения, связанного с ним, верно?

3. Не делайте этого. Просто сохраните AI.

Ответ №1:

Использование trigger для обновления trip_num столбца — один из способов достижения желаемого результата, но я бы посоветовал не использовать triggers , поскольку у него много недостатков. Некоторые из них следующие:

  • вам понадобится триггер для действий вставки / удаления / обновления.
  • В insert trigger вам нужно будет назначить trip_number для каждого пользователя.
  • В update trigger , вам нужно будет проверить, обновлен ли пользовательский столбец, если да, то вам нужно будет trip_number соответствующим образом организовать.
  • Кроме delete trigger того, вам придется упорядочить все trip_num , если одна из записей, кроме последней записи пользователя, будет удалена.
  • Если две транзакции происходят одновременно для одного и того же пользователя, то есть вероятность, что триггеры назначают одинаковые trip_num значения для разных строк одного и того же пользователя.

Итак, чтобы избежать этого, вы можете использовать view следующее:

 Create view vw_name as
Select t.*, -- use column names and remove trip_num column 
       Row_number() over (partition by user order by trip_date) as trip_num
  From your_table t