【问题标题】:How to design this DB structure in MySQL?如何在 MySQL 中设计这种 DB 结构?
【发布时间】:2016-07-19 13:20:33
【问题描述】:

我现在被困在如何实现更复杂(至少对我而言)的数据库结构上,在我看来,这就像一个表中的动态列数。

我需要为一个班车模块创建一个 SQL 表,该模块将存储许多班车,每个班车都有不同的座位数,每个座位应该有不同的价格。

例如:
一排:8 个座位的穿梭巴士,1 号座位 = 20 美元,2 号座位 = 15 美元,3 号座位 = 13 美元……8 号座位 = 7 美元。
一排:16 个座位的班车,1 号座位 = 25 美元,2 号座位 = 22 美元,3 号座位 = 20 美元……16 号座位 = 15 美元。

解决方案应处理不同类型的班车,一种有 8 个座位,一种有 16 个座位或任何其他座位数,具体取决于管理员希望添加的座位数。

现在,我想了几个方法,我认为这两种方法都不够好。

1.我的第一个想法是 创建一个最多包含 16 列座位的表,所有列都可以为空,然后管理员插入带有所需座位数的新班车,其余的将为空。我觉得这是一个非常糟糕的主意。 如果管理员想要添加超过 16 个座位,这是一个巨大的缺点,让我们忽略这种情况,这就是桌子的样子:

Table: shuttle
Columns: id, name, num_of_seats, seat_1_price, seat_2_price, seat_3_price..., seat_16_price

那么此表中的一行可能如下所示:

1, Florida Shuttle, 8, 20, 15, 10, 8..., 5, NULL, NULL, NULL

我 100% 确定这种方法是错误的。

2.我的第二个想法是创建2个表,一个存储shuttle细节将被称为“shuttles”,第二个存储shuttle_seats_price关系,例如:

table: shuttles
columns: id, name, num_of_seats

table2: shuttle_seats_price
columns: id, shuttle_id, seat_number, seat_price

此结构中的典型条目如下所示:

table: shuttles
columns: id, name, num_of_seats
row: 2, Florida Shuttle, 8

table 2: shuttle_seats_price
columns: id, shuttle_id, seat_number, seat_price
row: 1, 2, 1, 20
row: 1, 2, 2, 15
row: 1, 2, 3, 13
row: 1, 2, 4, 11
...
row: 1, 2, 8, 5

所以总而言之,我需要创建一个解决方案来存储具有不可预测座位数量的不同班车,每个座位都有不同的价格价值,一张桌子对我来说似乎不是正确的解决方案,因为在我看来,它不是一种创建 100 列的好方法,每个席位的每一列并开始使用 NULL 值对其进行膨胀。

提前致谢!我希望我问的很清楚!

【问题讨论】:

  • 数据库是信息的存储库,而不是计算引擎。使用 SQL 以外的编程语言完成任务。
  • 能否给个更详细的回答?目前,我需要将数据存储在某个地方,并且这些数据是动态的,管理员正在创建一些班车,每个班车都有不同数量的座位,价格不同,用户可以选择他想要的班车......没有如何实现它?
  • 发生更改时将更改存储在数据库中。每次你想要一个穿梭机时,加载整个数据集,用 PHP(或 Java 或 VB 或......)咀嚼它,然后提供答案。
  • 好的,在 SQL 中是可以的。但我宁愿用其他语言而不是 SQL 来编程。
  • 好的,谢谢你的回答,让我看看我是否理解你的建议,只为班车创建一个表,添加一个名为 seat_prices 的列并以逗号分隔格式存储?像这样:20、15、13、10?然后拿价格,做一些PHP并以这种方式编程?这是一个好方法吗?顺便问一下,如何在 SQL 中实现呢?你将如何创造这样的东西?因为我之前已经遇到过类似的问题,创建了一个列数未知的表,因为有时需要更多的列,然后在此示例中为多个座位创建相同的列。

标签: mysql sql database database-design relational-database


【解决方案1】:

我会创建 2 个表:Shuttle 和 Seat。

你是这样读的,一个班车可以有多个座位,但一个座位只能连接一个班车。

因此,您创建了一个班车,并添加了您想要的座位数量。

我已经制作了一个 UML 图,您可以自己查看

编辑:调整图片

EDIT2:也从航天飞机中删除“RowId”属性,这是我的错误。

EDIT3:#seats 也不是真正需要的。例如,如果您想要 ID 为 3 的班车的座位数,您可以简单地这样做:

SELECT COUNT(*) FROM seats WHERE shuttle_id = '3';

此查询的结果将是该班车的座位数。

【讨论】:

    【解决方案2】:

    | 由编号SHTNUM 标识的班车最多有MAX_SEATNUM 座位。

    对于每辆班车,该班车恰好有一个最大座位数; 多辆班车的最大座位数可以相同。

    Shuttle {SHTNUM, MAX_SEATNUM}
        KEY {SHTNUM}
    


    | 班车SHTNUM 的座位号为SEATNUM,售价为PRICE 美元。

    对于每辆班车,该班车有多个座位号。

    对于每个座位号,该号码可能存在于多个班车中。

    每个座位由 SHTNUM、SEATNUM 的组合标识。

    每个座位都有一个价格,对于每个价格,有可能不止一个座位有这个价格。

    对于每个班车中的每个座位号,该座位号都大于 0。

    ShuttleSeat {SHTNUM, SEATNUM, PRICE}
            KEY {SHTNUM, SEATNUM}
    FOREIGN KEY {SHTNUM} REFERENCES Shuttle {SHTNUM}
    
    CHECK SEATNUM > 0
    

    对于每个班车中的每个座位号,该座位号小于或等于该班车的 MAX_SEATNUM 个。

    -- You will need to implement this constraint 
    -- in the application code or using triggers.
    

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 2012-02-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2011-04-20
      相关资源
      最近更新 更多