【问题标题】:Create and structure a complex seating structure in SQL?在 SQL 中创建和构建复杂的座位结构?
【发布时间】:2016-07-05 14:16:00
【问题描述】:

我正在尝试在 mySQL 中为预订系统中的体育场座位创建数据结构。我希望能够查询数据库,遍历块以创建图形表示并能够预订座位。情况是:

  • 很多座位,我们会说 A 到 G。
  • 'x' 排座位 A、B、C... 因街区而异。
  • “y”个座位数,因行而异(A:35,B:32 等)
  • 每个座位都有一个状态(已预订/可用)和一个客户参考。 (外键)。

我猜会有一个“主”表,每个座位都有一行,列用于块、行、位置、状态、客户等。用作外键的行。

问题是我显然不想手动插入每个座位,那么如何通过输入一排座位的数量来自动插入,然后自动生成座位?

最后,我怎样才能重复使用它,以便它可以多次用于更多活动?为每个活动的每个座位添加记录将需要资源。

那么,有什么方法可以构建这些数据,我会用什么来让我的生活更简单、更容易生成?

程序是java,可能需要一个函数来构建结构?

【问题讨论】:

  • 我会说构建您的解决方案(模型体育场、街区、行、座位等),然后它会变得更清楚您需要哪些持久数据。
  • @c0der 你能解释一下你的意思吗?
  • 我的意思是为解决方案建模:为体育场、街区、行等定义类/对象。这将使您需要存储的数据更易于定义。

标签: java mysql data-structures


【解决方案1】:

您可以创建类似的表格

   Table definition                      | Sample data
   Block - Id, Name                      | (1, 'A'), (2, 'B')
    Row - Id, BlockId, Name              | (1 , 1, 'A'), (2 , 1, 'B')
    Seat - Id, rowId, Name               | (1 , 1, 'A1'), (2 , 1, 'A2')

    Event - Id, Name, Date               | (1 , 'Musical Concert', '2016-07/05')

   EventSeats - EventId, SeatId, Status  | (1 , 1, 1), (1 , 2, 0)

P.S 状态 1 - 已预订,状态 0 - 可用

如果您像上面那样创建模型,您可以将一排的所有座位插入一个块中。

您还可以为每个活动预订座位。客户姓名等预订信息可以存储在 EventSeat 表中。希望这能回答你的最后一个问题。

现在让我回答你的第一个问题。 “我不想手动插入每个座位”

由您来实现逻辑。 您可以做的是,您可以从用户输入中获取街区数、每个街区的行数以及每行的座位数。

然后循环遍历它并以编程方式在循环中插入数据。希望你明白了。

【讨论】:

  • 有没有办法使用 SQL 为新活动的每个座位创建记录?我不认为 for 循环中每个座位的插入语句是最有效的方法。
  • 您想在活动席位中记录一个活动的所有席位吗?那么如何跟踪每个座位是否已被预订?
  • 不抱歉,我希望使用您的建议,但有没有办法为所有座位自动插入新的 EventSeat 记录?即使他们有空,他们也需要在那里。
  • 我刚刚给出了伪代码。但是您可以使用 Java 来实现它。或者,您可以使用 sql 存储过程实现相同的逻辑并从 Java 代码中调用它们
  • int newEventId = 2; //e.g EventSeat eventSeat = null //遍历所有的block for(Block block in Blocks){ //获取每个block的所有行 for(Row row in block.rows){ //获取每行的所有座位 for( Seat seat in row.seats){ //为一个座位创建每个条目 eventSeat = new EventSeat(); eventSeat.setSeatId(seat.getSetId()); eventSeat.setStatus(0); ..... session.save(eventSeat) } } }
【解决方案2】:

我只是在这里给你伪代码,它在评论中给出以提高可读性。

Java 代码

int newEventId = 2; //e.g
EventSeat eventSeat = null
//Loop through all the blocks
for(Block block in Blocks){

    //Get all rows of each blocks
    for(Row row in block.rows){

        //Get all seats of each row
        for(Seat seat in row.seats){
            //Create each entry for one seat
            eventSeat = new EventSeat();
            eventSeat.setSeatId(seat.getSetId());
            eventSeat.setStatus(0);
            .....
            session.save(eventSeat)
        }
    }
} 

存储过程

CREATE PROCEDURE dbo.fillEventSeat @eventId INT
AS

DECLARE @seatCounter INT  @MaxSeatId INT, @seatId INT

SELECT @seatCounter = MIN(Id) , @MaxSeatId = MAX(Id) 
FROM Seat

WHILE(@seatCounter IS NOT NULL
      AND @seatCounter <= @MaxSeatId)

    SELECT @seatId = Id
    FROM Seat WHERE Id = @seatCounter

   INSERT INTO EventSeat(eventId, seatId, status) VALUES (@eventId, @seatId, 0);

   SET @seatCounter  = @seatCounter  + 1        
END
GO

【讨论】:

  • 每个 EventSeat 记录上的单独插入语句是否有效?或者有没有更好的方法来添加许多记录?
  • 您必须以某种方式插入每个座位的所有条目。如果你觉得这有点慢。如果您使用如下所示的存储过程,您可能会获得更多优势。
  • 如果您使用上面编辑过的答案中显示的存储过程,您可能会获得更多优势。
猜你喜欢
  • 2018-12-12
  • 2020-07-16
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
相关资源
最近更新 更多