【问题标题】:how relate one table to another for future records如何将一张表与另一张表关联以备将来记录
【发布时间】:2010-04-19 21:42:56
【问题描述】:

我有一个包含游戏数据的游戏表。 然后是另一个包含新闻数据的表。

到目前为止一切顺利。

首先我想为 game_news 创建一个连接表,以便将新闻与游戏联系起来。

当游戏存在时,这种方式会按预期工作。因此,每当我插入新闻时,我都可以使用联结表将其与游戏相关联。

但是,有些情况下,有关于游戏的新闻,但游戏未发布且不存在。

所以我的问题是;有没有办法在创建游戏记录时将这些新闻与特定游戏相关联。

最好的方法是什么?有什么想法吗?

【问题讨论】:

    标签: sql mysql database-design data-modeling


    【解决方案1】:

    联结表是要走的路。如果一篇新闻文章涉及多个游戏,那么您需要它。要处理尚不存在的游戏,只需为它们插入一行,包括您当前了解的所有信息(可能来自新闻文章)并有一个状态列将其标记为尚未发布。您可以将此游戏显示为尚未发布或传闻等。

    这样设置表格:

    Games
    GameID           int          not null auto increment PK
    GameStatus       char(1)      not null "P"=published, "N"=not released yet, "R"=game is only a rumor
    GameReleaseDate  date         null
    GameName         varchar(...) not null
    GameDescription...
    ...
    
    News
    NewsID      int               not null auto increment PK
    NewsTitle   varchar(...)      not null
    ...
    
    GameNews
    GameNewsID  int auto increment PK
    GameID      int FK to Games.GameID
    NewsID      int FK to News.NewsID
    

    通过此设置,您可以拥有与单个新闻项目相关的多个游戏。只需插入所有正确的 GameNews 行,即可将每个游戏链接到 News 行。

    如果游戏尚未发布,您仍然可以通过创建状态为“N”或“R”(或类似)的 Games 行并使用 GameNews 表将其链接到新闻已发布的游戏。您可以使用尽可能多的信息填充游戏中的所有字段,并在发现更多信息时对其进行更新。最后,您将在 Games 行中获得完整的游戏信息(在游戏发布后),并且它会链接到所有 News 行,即使它只是新闻中的谣言。

    为了让您了解我在说什么,下面是一个“传闻”游戏的数据随时间变化的示例(这是一个简化的示例,每个新闻行没有多个游戏):

    data as of 1/1/2010
        Games    GameID  GameStatus  GameReleaseDate  GameName
                 1234    "R"         1/1/2012         "God of War 4"
        News     NewsID  NewsTitle
                 543     "Future Of Games"
        GameNews GameNewsID  GameID  NewsID
                 768         1234    543
    
    data as of 4/1/2010
        Games    GameID  GameStatus  GameReleaseDate  GameName
                 1234    "R"         1/1/2012         "God of War 4"
        News     NewsID  NewsTitle
                 543     "Future Of Games"
                 544     "Interview with John Hight"
        GameNews GameNewsID  GameID  NewsID
                 768         1234    543
                 769         1234    544
    
    data as of 11/20/2010
        Games    GameID  GameStatus  GameReleaseDate  GameName
                 1234    "N"         12/31/2011         "God of War IV"
        News     NewsID  NewsTitle
                 543     "Future Of Games"
                 544     "Interview with John Hight"
                 545     "God of War Expected Next Year"
        GameNews GameNewsID  GameID  NewsID
                 768         1234    543
                 769         1234    544
                 770         1234    545
    
    data as of 8/15/2011
        Games    GameID  GameStatus  GameReleaseDate  GameName
                 1234    "N"         12/01/2011         "God of War IV"
        News     NewsID  NewsTitle
                 543     "Future Of Games"
                 544     "Interview with John Hight"
                 545     "God of War Expected Next Year"
                 546     "Retailers Get Ready For New Games"
        GameNews GameNewsID  GameID  NewsID
                 768         1234    543
                 769         1234    544
                 770         1234    545
                 771         1234    546
    
    data as of 1/1/2012
        Games    GameID  GameStatus  GameReleaseDate  GameName
                 1234    "P"         12/01/2011         "God of War IV"
        News     NewsID  NewsTitle
                 543     "Future Of Games"
                 544     "Interview with John Hight"
                 545     "God of War Expected Next Year"
                 546     "Retailers Get Ready For New Games"
                 547     "God of War IV Review"
        GameNews GameNewsID  GameID  NewsID
                 768         1234    543
                 769         1234    544
                 770         1234    545
                 771         1234    546
                 772         1234    547
    

    如果您在 2012 年 1 月 1 日查看 News.NewsID=543,您会看到它链接到完整且经过审核的 Games.GameID=1234,即使 News.NewsID=543 文章是关于“传闻“即将推出的战神版本。所有这一切都是在没有对旧的 News 或 GameNews 行进行任何更改的情况下完成的。

    【讨论】:

      【解决方案2】:

      您有 3 个选项 - 1 是在“游戏”表上设置一个标志来说明它是否已发布,如果游戏未发布,则仅显示名称(或什至不显示名称)。

      另一种是在添加游戏项目并链接后编辑新闻项目。因为在添加游戏之前您无法确定唯一 ID 是什么。

      第三个不推荐的选项是通过游戏名称而不是主键链接它们,因此您在新闻表中有一个名为 game_name 的列,它以这种方式链接表。但是,如果您拼写错误并且远不及选项 1 或 2,那将失败。

      【讨论】:

        【解决方案3】:

        最简单的答案是拥有从新闻到游戏的外键。如果您正在为尚不存在的游戏创建新闻,只需在游戏表中创建一个存根记录。如果需要,您可以将其标记为这样。添加游戏时,只需充实此存根记录即可。

        【讨论】:

          【解决方案4】:

          在联结表中放置两个外键是个好主意。外键引用存在的事物。执行此操作称为“参照完整性”。允许引用不存在的项目是通往混乱之路。

          如果你得到一篇关于游戏的新闻文章,但不存在(在数据库中),你基本上有两种选择:先将游戏添加到游戏表中,然后再将游戏引用添加到联结表中;或者,暂时省略文章与游戏的关系。

          【讨论】:

          • 我在考虑忽略这种关系。这对我来说似乎是最好的方法。但是,假设我为战神 4 创建了许多新闻记录,这些记录将在 2 年后创建。现在在游戏发布的几年里,它将被创建,但我怎么知道哪些记录与游戏相关?也许是一些标签系统?我真的不确定。
          【解决方案5】:

          “但也有游戏有新闻但游戏未发布且不存在的情况。”

          你应该理清“存在”的含义。如果某样东西不存在,那么就没有任何东西可以与之相关,句号。

          如果您的业务现实包含“存在并为公众所知”和“存在但只是私下而不为公众所知”之间的区别,那么您的模型应该承认并反映这一现实。

          完全有可能将信息与“存在但未公开”的任何事物联系起来。不可能将信息与任何不存在的事物联系起来。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-09-21
            • 1970-01-01
            • 2017-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多