[英]how relate one table to another for future records
我有一个游戏表,其中包含有关游戏的数据。 然后是另一个表,其中包含有关新闻的数据。
到现在为止还挺好。
首先,我考虑为game_news创建一个联结表,以便将新闻与游戏相关联。
当游戏存在时,这种方式可以按预期工作。 因此,无论何时插入新闻,我都可以使用联结表将其与游戏相关联。
但是,在某些情况下,有关于游戏的新闻,但游戏尚未发布且不存在。
所以我的问题是; 创建游戏记录时,是否有办法将这些新闻与特定游戏相关联。
做这个的最好方式是什么? 有任何想法吗?
您有3个选项-1是在“游戏”表上设置一个标志,以说明是否发布,如果游戏未发布,则仅显示名称(甚至不显示该名称)。
另一种是在添加游戏项目并链接之后编辑新闻项目。 因为您无法在添加游戏之前就知道唯一的ID。
第三个UNRECOMMENDED选项是通过游戏名称而不是主键链接它们,因此您在新闻表中有一列名为game_name的列,并以此方式链接了表。 但是,如果您拼写错误,那将失败,并且远不及选项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行,即可将每个游戏链接到News行。
如果尚未发布游戏,则仍可以通过创建状态为“ 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,那么即使News.NewsID = 543文章涉及即将“传闻”的文章,您也会看到它链接到完整且经过审查的Games.GameID = 1234。版本的战神。 所有这些操作都无需对旧的News或GameNews行进行任何更改。
最简单的答案是从新闻到游戏都具有外键。 如果您要为尚不存在的游戏创建新闻,只需在游戏表中创建存根记录。 您可以根据需要对其进行标记。 添加游戏时,只需充实此存根记录即可。
将两个外键放在联结表中是一个好主意。 外键引用存在的事物。 强制执行此操作称为“参照完整性”。 允许引用不存在的项目是通往混乱的道路。
如果您获得有关某个尚未存在的游戏的新闻文章(在数据库中),则基本上有两种选择:将游戏添加到游戏表中,然后在联结表中添加对游戏的引用; 或者,暂时忽略商品与游戏之间的关系。
“但是,在某些情况下,有关于游戏的新闻,但是该游戏没有发布并且不存在。”
您应该理清“存在”的含义。 如果某个东西不存在,那么没有任何东西可以与之联系。
如果您的业务现实包含“已存在并为公众所知”与“已存在,但仅是私人存在而未被公众所知”之间的区别,则您的模型应承认并拒绝该现实。
完全有可能将信息与“存在但未公开”的任何事物相关联。 不可能将信息与不存在的任何事物相关联。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.