sql - 如何将一个表与另一个表关联起来以备将来记录

标签 sql mysql database-design data-modeling

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

到目前为止一切顺利。

首先,我考虑为 game_news 创建一个联结表,这样我就可以将新闻与游戏联系起来。

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

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

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

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

最佳答案

联结表是必经之路。如果一篇新闻文章是关于不止一款游戏的,那么你就需要它。要处理尚不存在的游戏,只需为它们插入一行,包括您当前了解的所有信息(可能来自新闻文章),并在状态栏中标记它尚未发布。您可以将此游戏显示为尚未发布或谣言等。

像这样设置表格:

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 行即可将每个游戏链接到新闻行。

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

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

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 文章是关于“传闻”即将推出的战神版本。所有这一切都是在不对旧新闻或游戏新闻行进行任何更改的情况下完成的。

关于sql - 如何将一个表与另一个表关联起来以备将来记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2649763/

相关文章:

sql - Postgresql:返回未在搜索结束时找到的结果

java - 从 Java 在 MySQL 中记录 utf-8 字符串时出现问题

mysql - 解耦 MySQL 数据与易用性

mysql - 在 MySQL 中导入 CSV 数据时空整数字段的默认值

database - 在数据库列中存储分隔列表真的那么糟糕吗?

sql-server - 数据库设计-复合键关系问题

mysql - 仅当值不存在时返回行

sql - 通过 Hibernate 更新计数器

sql - ORACLE:解释插入计划

php - 使用函数和 if else 的多个搜索表单