我试图建立一个电影票务预订应用程序,只是为了实践面试低水平的设计视角。
一个剧院可以有多个屏幕和每个屏幕作为一些座位的容量。放映是一部将在银幕上放映的电影。
下面是我创建的模型/实体类。
public class Booking {
private final String id;
private final Show show;
private final List<Seat> seatsBooked;
private final String user;
private BookingStatus bookingStatus;
}
public enum BookingStatus {
Created,
Confirmed,
Expired
}
public class Movie {
private final String id;
private final String name;
//Other metadata
}
public class Screen {
private final String id;
private final String name;
private final Theatre theatre;
//Other screen metadata.
private final List<Seat> seats;
}
public class Seat {
private final String id;
private final int rowNo;
private final int seatNo;
}
public class Show {
private final String id;
private final Movie movie;
private final Screen screen;
private final Date startTime;
private final Integer durationInSeconds;
}
public class Theatre {
private final String id;
private final String name;
private final List<Screen> screens;
//Other theatre metadata.
}参考链接获取完整代码和参考- 电影票预订应用程序
我还没有在类中包含getter、setter和一些方法。在这里,当用户在应用程序中搜索电影名称时,它将由ShowController.java处理,并将显示在影院中的一些电影放映给用户。然后,如果用户为一个特定的影院屏幕选择一个节目。然后用户会根据自己的选择选择一些座位。现在问题来了,当一个用户选择一个座位列表时,我想将这些座位状态更改为CREATED (enum BookingStatus),而那些所选的座位必须是其他用户不可用的。因此,我如何标记这些座位被其他用户占用或不可用,因为它是一个多线程应用程序。此外,如果用户支付失败或注销,我如何才能解锁这些座位,以便他们可以为其他用户。
请提供一些代码或任何有用的链接,如何做到这一点?这是一种很好的方法来保存座位的状态,当更改为在内存存储中创建的像Redis,对于用户选择的座位,我们检查每个座位的状态在Redis中是否是保留的。如果用户成功预订,那么我们可以在数据库中将这些座位标记为永久保留。
发布于 2022-09-03 00:45:14
这并不是一个真正的答案,因为我不是一个数据库的人,但这里有一个粗略的草图,我将尝试:
on_hold,它会对它们进行时间戳,并将表解锁。on_hold阻止其他用户预订相同的座位,但只能保留一段有限的时间--也许只有5分钟。这些座位还与“购物车”有关。on_hold超过5分钟,应用程序将;
将座位状态更改为available,以及
取消那个座位的购物车。(购物车的主人看到一个对话框,上面写着“哦!太糟了!太可悲了!你等得太久了”,他们被送回第一步。)sold,解锁座位表,并发送给用户他们的票。发布于 2022-09-03 00:56:08
粗略而仓促的大脑转储:同意Uldall的观点,首先创建数据模型和SQL,然后规范化并验证它。您需要一个客户实体/表。我认为您需要一个显示和座位之间的关联实体,就像ShowSeat提供了对显示、座位和客户的引用。ShowSeat还具有isConfirmed布尔标志和lockExpirationTimestamp。show_seat表上的主键是show_id和seat_id的组合(需要@Embeddable类来表示)。当客户选择节目的座位时,将行插入到show_seat中,但在确认前不要设置确认=‘Y’。show_seat表中包含lock_expiration_timestamp < now()并确认为‘N’的任何行都是公平的,可以交给另一个客户。
https://stackoverflow.com/questions/73586759
复制相似问题