代码之家  ›  专栏  ›  技术社区  ›  Shane

如何在关系数据库中建模?

  •  1
  • Shane  · 技术社区  · 15 年前

    我有一个数据库来模拟租赁业务。数据库存储多个供应商(所有者)的信息,每个供应商都有一个仓库的子集。每个仓库在一年中的某些天关闭,一些特定于该仓库(可能每周六或感恩节关闭一周),另一些是全球性的(所有仓库都在圣诞节关闭)。我正试图找出建立这个模型的最佳方法。

    我的第一个想法是建立一个非封闭的表格,如下所示:

    depotclosed
       id (PK) INT
       start_date DATE
       end_date DATE
       display VARCHAR
       global BOOLEAN
       depot_id (FK)
    

    我的问题是,当它是一个全球假日时,仓库ID将为空,但它不是“未定义的”,假日只适用于所有仓库。也许我只是做了一笔比我应该做的更多的交易。任何想法都是受欢迎的。

    谢谢

    4 回复  |  直到 15 年前
        1
  •  1
  •   Vince    15 年前

    我觉得这个结构很好。您可以只选择全局为真的所有行。这将转换为两个查询来查找单个商店的关闭日期,一个查询用于单个商店的所有关闭日期,另一个查询用于所有全局关闭日期。您有正确的想法,避免为每个商店输入全局日期条目:如果需要更改某些内容,这将是一种痛苦。

        2
  •  1
  •   VoteyDisciple    15 年前

    我的首选是明确记录每个仓库的关闭情况(即在其中添加一行 depotclosed 每个仓库的桌子)。这样就不会有歧义,你可以表现得很普通 JOIN 对着桌子。

    或者,您可以将Depot_ID留空(即, NULL )从而使人们理解,当没有车辆段被列出时,它适用于所有车辆段。不过,这样你就得写 加入 是这样的:

    SELECT things
    FROM depot
    INNER JOIN depotclosed ON (depotclosed.depot_id = depot.depot_id OR depotclosed.depot_id IS NULL)
    
        3
  •  0
  •   JoshJordan    15 年前

    我会发现这是一个可以接受的解决方案。只要确保应用程序逻辑始终检查 全球的 布尔值 德波特里德 . 此外,请确保您没有需要值的约束 德波特里德 作为一个FK。

    另一种选择,如我所见,是创建一个全局假日表和本地假日表,减去 全球的 布尔函数。这要求在应用程序中进行相同类型的检查,因此任何一种方法对我都可以。

        4
  •  0
  •   Walter Mitty    15 年前

    你预计总共有多少个停车场?如果答案是100,那么您可以考虑在万国假日的情况下为每个仓库在表中输入一行。它浪费空间,但实际上可能节省时间。

    对于任何给定的DEOPT,您必须执行的查询都非常简单,因为您不需要额外的逻辑来测试全局条目。