【问题标题】:Dynamically structured mySQL database for an Airline Reservation App航空公司预订应用程序的动态结构化 mySQL 数据库
【发布时间】:2013-11-15 19:27:28
【问题描述】:

我正在从事一个个人项目,需要一些有关 mySQL 数据库的指导。我正在尝试模拟航空公司预订系统,其中用户将个人帐户添加到 Accounts db 表中(带有用户名和密码信息)。然后我有我的航班数据库表来存储所有可用的航班。航班数据库表包含所有航班信息(列),包括出发城市、到达城市、出发时间、到达时间、价格、可用座位和座位容量。

我的问题是: 当用户预订航班时,我必须更新航班表中的可用座位值 (int)。但是我还必须将航班添加到 Accounts 表中的用户帐户。我想知道如何在 mySQL 中处理这个问题,我是否必须在 Accounts 表中添加一个新列,其中包含来自 Flight 的 db 表的相应航班的表索引。然后在用户预订航班时继续添加预订航班列以跟踪用户预订的所有航班?有没有更好的方法来使用航班预订信息更新帐户表?

非常感谢所有帮助。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    老实说,我可能会采取一些不同的方式。您可能会考虑添加一个额外的表格来跟踪座位预订情况。比如:

    表格:帐户

    ID | First Name | Last Name | Username | Password
    

    表格:航班

    ID | DepartureCity | ArrivalCity | DepartureTime | Price | SeatingCapcity
    

    表格:预订

    ID | Account_ID | Flight_ID | SeatNumber
    

    然后,您可以使用 SQL 函数和数学来确定特定航班上的可用座位数,并在进行更新时仅维护 Reservations 表。这还将特定帐户关联的所有航班链接到特定列,并且没有“硬编码”到特定列。 (即:一个用户可以预订多个航班)

    【讨论】:

      【解决方案2】:

      实现这一点的最佳方法是引入一个新表Bookings。一个可能的结构可能是

      CREATE TABLE Bookings (user_id INTEGER NOT NULL, flight_id INTEGER NOT NULL);
      

      然后您可以通过

      获取给定用户的所有航班
      SELECT f.* FROM Users u 
        LEFT JOIN Bookings b ON u.id = b.user_id 
        LEFT JOIN Flights f ON b.flight_id = f.id 
        WHERE u.id = ?
      

      并按

      计算给定航班的预订量
      SELECT count(*) FROM Flights f
        LEFT JOIN Bookings b
        WHERE f.id = ?
      

      这种结构有几个优点:

      • 如果用户预订的航班越来越多,您不必更改架构。更改数据库的架构是一项相当复杂且代价高昂的操作。 (顺便说一句:MySQL 中存在最大列数)

      • 您可以添加更多与预订相关的字段。也许您想跟踪预订情况。

      • 获取和添加数据更自然。如果添加列booked_flight_1booked_flight_2 等等。您必须检查尚未占用的插槽,当您考虑删除时,这会变得越来越复杂。在这里就像运行它一样简单

        INSERT INTO Bookings (user_id, flight_id) VALUES (1, 2)
        

      如果必须检查给定的航班是否可用,最好使用您的程序进行检查并将预订插入数据库(如果有)。

      联接和事务可能是您会发现有用的技术。 MySQL 文档和每一本关于关系数据库的好书都会在这方面给你一个介绍。您的问题在我听来是一个经典的教学示例。

      【讨论】:

      • 感谢这个 gregor,它有很大帮助
      猜你喜欢
      • 2015-04-08
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多