如何将一个表与另一个表关联以用于将来的记

时间:2010-04-15 23:53:57

标签: sql mysql database-design data-modeling

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

到目前为止一切顺利。

首先,我考虑为game_news创建联结表,以便将新闻与游戏联系起来。

当游戏存在时,这种方式可以正常工作。因此,每当我插入新闻时,我都可以使用联结表将其与游戏联系起来。

然而,有些情况下有关于游戏的消息,但游戏没有发布而且不存在。

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

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

5 个答案:

答案 0 :(得分:2)

你有3个选项 - 1是在'游戏'牌桌上设置一个标志,说明它是否已经发布,如果游戏未发布,只显示名称(或者不显示)。

另一种方法是在添加游戏项目之后编辑新闻项目并将其链接起来。因为在添加游戏之前你无法分辨出一个唯一的ID。

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

答案 1 :(得分:2)

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

设置表格如下:

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”(或类似内容)的游戏行并将其与新闻链接,并像使用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文章是关于“传言“即将推出的战神版本。所有这些都是在没有对旧的新闻或GameNews行进行任何更改的情况下完成的。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

如果您收到一篇关于尚未存在的游戏的新闻文章(在数据库中),您基本上有两个选择:在将游戏参考添加到联结表中之前将游戏添加到游戏桌中;或者,暂时省略文章与游戏之间的关系。

答案 4 :(得分:1)

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

你应该把你的想法理解为“存在”的含义。如果某些东西不存在,那么没有任何东西可以与它相关,期间。

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

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