这仅仅是一个概括的例子。我有一个静态的MySQL数据库参考表,其中包含几十行数据。该表的结构如下所示:
video_games
id int(11)
release_date datetime
title varchar(64)
msrp float
我有一个单独的表,称为“用户”,带有“ favorite_video_game_id”列,该表可以指向“ video_games”中的“ id”列。
在我建立的网站上,我有一个特殊的页面,专门显示一些特定游戏(“守望先锋”,“魔兽争霸”和“暗黑破坏神”)的粉丝的用户名。为了获取游戏信息和喜欢它们的用户,我有一个类似于以下内容的mysql语句:
select u.*, vg.*
from users u, video_games vg
where u.favorite_video_game_id = vg.id and vg.title= 'Warcraft';
在某个时候,我意识到我想在数据库“魔兽世界”中为游戏指定一个更具体的名称,因此我在数据库中更新了标题。但是,当我返回页面时,我意识到游戏信息和信息列表显示为空,因为“标题”列已更改,因此我现在需要更新所有代码。
当我意识到我想要扩展为更完整名称的所有标题以及需要在网站上进行的所有代码更改时,我感到我的PHP代码已与SQL数据紧密耦合,例如我将内容数据硬编码到我的PHP文件中。我的第一个想法是更改mysql代码以直接引用ID,如下所示:
select u.*, vg.*
from users u, video_games vg
where u.favorite_video_game_id = vg.id and vg.id= 13;
但是,我读到,不建议直接使用主键列,因为将来可能会发生一些实例,需要更改ID,或者将数据转移到另一个数据库供应商,而不再使用ID正确。
我的下一个想法是添加另一个索引键列,可能是随机哈希值,这对于视频游戏也是唯一的,不会遇到上述问题。但是在已经有id列的情况下添加另一个唯一键列似乎有点奇怪/多余,我想知道我是否会丢失/忽略某些东西,以至于无法在不将我的PHP耦合到内容列的情况下唯一地标识行数据库。
在这种情况下最佳的设计实践是什么?谢谢。
最佳答案
我投票赞成第一个答案,因为它基本上描述了您应该如何设计数据库结构,他是正确的。如果必须在第三张表中使用唯一键,则可以使用email
,phone
或任何其他键,这些键在用户表中是唯一的,并且在游戏表中的使用方式也相同:如果您在在那里,也欢迎您在第三张表中使用它。基本上,第三个表是做什么的,它只是将您的两个表(如用户和游戏)相关联。