【问题标题】:Rooms/People management application database structure房间/人员管理应用程序数据库结构
【发布时间】:2013-11-15 12:21:59
【问题描述】:

我正在尝试构建一个管理儿童托儿所的应用程序,特别是管理哪个孩子在托儿所的哪个房间里。

托儿所连锁有几个分支。每个分店都有几个房间,每个房间对应一个年龄段,容量有限。

孩子们提前一个月注册托儿所,并按月预订,因此他们有一个开始月份和预计结束月份。他们可以在任何特定的日子预订,无论是上午、下午或两者兼而有之。因此,例如,一个孩子可能会注册并希望被预订:

mon   AM
tues     PM
wed   AM PM
thurs AM 
fri   AM PM
sat   
sun   AM

孩子 3 岁,所以房间里的毛毛虫或兔子都适合他。我需要检查这些房间是否有空房,如果有,请记录下这个孩子将从 X 月到 Y 月被预订到那个房间。

所以我有一张儿童桌和一张房间桌,但我发现很难弄清楚如何根据孩子的年龄将他们分配到房间,以及基本上如何记录谁在哪个房间。

我知道这可能很简单,但数据库结构总是让我头疼!

设置我的数据库以记录孩子和房间以及谁在哪里的最佳方法是什么?

【问题讨论】:

    标签: database database-design data-structures


    【解决方案1】:

    下面的结构应该让您知道从哪里开始。您可以查询children 表以了解有多少孩子被分配到特定分支的特定房间,并将其与rooms 表中声明的房间容量进行比较。 rooms 表还告诉您允许的年龄范围。

    在现实世界中,还有其他事情需要考虑:是否所有分支机构都拥有相同的房间?如果多个分店有一个“兔子”房间,所有这些兔子房间是否都限制在相同的年龄范围和容量?孩子可以去不同的分支机构还是只能去他们注册的那个?

    此类问题的答案可能会影响数据库的设计。

    bookings
        id          unsigned int(P)
        child_id    unsigned int(F children.id)
        beg         datetime
        end         datetime
    
    +----+----------+---------------------+---------------------+
    | id | child_id | beg                 | end                 |
    +----+----------+---------------------+---------------------+
    |  1 |        1 | 2013-11-14 07:30:00 | 2013-11-14 19:30:00 |
    |  2 |        2 | 2013-11-14 07:30:00 | 2013-11-14 19:30:00 |
    |  3 |        1 | 2013-11-15 07:30:00 | 2013-11-14 19:30:00 |
    |  4 |        2 | 2013-11-15 07:30:00 | 2013-11-14 13:00:00 |
    |  5 |        2 | 2013-11-14 20:00:00 | 2013-11-14 22:00:00 |
    | .. | ........ | ................... | ................... |
    +----+----------+---------------------+---------------------+
    
    branches
        id              unsigned int(P)
        name            varchar(20)
    
    +----+--------------+
    | id | name         |
    +----+--------------+
    |  1 | North Branch |
    |  2 | South Branch |
    | .. | ............ |
    +----+--------------+
    
    branches_rooms
        id              unsigned int(P)
        branch_id       unsigned int(F branches.id)
        room_id         unsigned int(F rooms.id)
    *branch_id and room_id form a unique composite key to prevent someone 
    from saying the North Branch has multiple "Rabbits" rooms for example.
    
    +----+-----------+---------+
    | id | branch_id | room_id |
    +----+-----------+---------+
    |  1 |         1 |       1 |
    |  2 |         2 |       2 |
    | .. | ......... | ....... |
    +----+-----------+---------+
    
    checks
        id                  unsigned int(P)
        child_id            unsigned int(F children.id)
        in                  datetime
        out                 datetime
    
    +----+----------+---------------------+---------------------+
    | id | child_id | in                  | out                 |
    +----+----------+---------------------+---------------------+
    |  1 |        1 | 2013-11-13 07:33:51 | 2013-11-13 17:34:13 |
    |  2 |        2 | 2013-11-13 07:41:33 | 2013-11-13 17:22:18 |
    |  3 |        1 | 2013-11-14 07:28:15 | NULL                |
    |  4 |        2 | 2013-11-14 07:58:42 | NULL                |
    | .. | ........ | ................... | ................... |
    +----+----------+---------------------+---------------------+
    
    children
        id                  unsigned int(P)
        name                varchar(30)
        branch_room_id      unsigned int(F branches_rooms.id)
        beg                 date
        end                 date
        ...
    
    +----+-------+-----+----------+-----+
    | id | name  | branch_room_id | ... |
    +----+-------+-----+----------+-----+
    |  1 | Billy |              1 | ... |
    |  2 | Susie |              2 | ... |
    | .. | ..... | .............. | ... |
    +----+-------+-----+----------+-----+
    
    rooms
        id          unsigned int(P)
        name        varchar(20)
        min_age     unsigned int
        max_age     unsigned int
        capacity    unsigned int
    
    +----+--------------+---------+---------+----------+
    | id | name         | min_age | max_age | capacity |
    +----+--------------+---------+---------+----------+
    |  1 | Caterpillers |       0 |       3 |       10 |
    |  2 | Rabbits      |       2 |       4 |       15 |
    | .. | ............ | ....... | ....... | ........ |
    +----+--------------+---------+---------+----------+
    

    【讨论】:

    • 嗨,Benny,感谢您抽出宝贵时间输入所有内容。对此,我真的非常感激。为了回答您的 Qus,每个分支都会有不同名称的不同房间。孩子只能去他们注册的确切房间。但我想我可以处理好这一切。这是检查一个房间里有多少孩子以及什么时候。所以你的支票表是个好主意。如果我有一个带有完全唯一 ID 的房间,我可以使用它和孩子的 ID 来存储他们所在的位置。之前,我认为开始和结束日期将在儿童表中。我认为这是对的 Innit?
    • @ZaphodBeeblebrox - 您可能在children 表中也有开始和结束日期。 checks 表就像一个“时钟”表 - 孩子在到达房间时登记入住,在离开时退房。我不认为你要求这样做,但我在写这篇文章时正在考虑我儿子的日托是如何运作的 :-)
    • 嗯……你给了我很好的思考。我认为他们不需要办理入住/退房手续,因为他们会出勤,所以这不是问题。我现在的主要问题是弄清楚如何处理孩子想要的行程。例如,如果需要在周一上午和下午以及周四下午预订一个孩子,那么我该如何记录呢?我现在能想到的就是我会有另一个表,“行程”,其中包含 monday_am、monday_pm 等列...(以及 child_id),然后在条目中为 1 或 0。你怎么看?再次感谢您对此的投入,非常感谢:)
    • @ZaphodBeeblebrox - 我编辑了我的答案并添加了一个bookings 表。这将允许您从任何时间到任何时间安排一个孩子。在我的示例数据中,您可以看到 Susie 安排在 2013 年 11 月 14 日星期五上午 7:30 到下午 1:00,然后她在当晚从晚上 8:00 到晚上 10:00 回来(妈妈和爸爸必须有一个“约会”晚上”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2018-10-09
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多