最终,它归结为使用和体系结构。
建筑
系统是否处理“任何运动”?您是不是戴上了宇航员的建筑帽,并构建了一个通用系统来处理将来甚至可能不存在的未来运动的想法?
如果是这样,显然拥有动态命名的表将是一个巨大的痛苦,因此,如果需要,具有支持n体育的模式将是有意义的。
就是说,我对这种方法有很大的偏见:这几乎总是更多的工作,并且导致较差的结果。为每种运动创建单独的UI,架构等最终将带来更好的用户体验,并且更易于维护代码,即使这确实意味着一定程度的表面重复(如何避免/最小化这是一个单独的问题)。
您如何处理进行多项运动的球员?他们得到两个条目(例如,您对待不同的人)还是要尝试对他们做一些特定的事情?
采用
因此,假设您没有动态进行运动(例如,如果某人想要添加一项新运动,则需要开发人员才能添加它)。
有没有一次您一次显示一项以上运动中的球员(或您提到的任何其他物体)?
我可以在搜索功能中看到它,您可以在其中按球员或球队名称(无论运动项目)进行搜索,但是除此之外,我无法想象很多用例。
如果您永远不需要这样做,那么您的方法就很好。您可以在这里停止阅读。
替代方案
观看次数
我是KISS的粉丝。在15多年的软件开发中,我继续回到“构建最简单的工具”这一理念。
因此,假设跨运动搜索功能确实是唯一的用例,我的最初反应是创建视图:
SELECT PlayerName, 'NFL' as [Sport], TeamName FROM NFL_Players JOIN NFL_Teams ...
UNION
SELECT PlayerName, 'NHL' as [Sport], TeamName FROM NHL_Players JOIN NHL_Teams ...
UNION ....
当然,如果添加新运动,则必须添加到视图中。包括其他公共信息也可能很有用,但实际上这取决于需要显示的内容。
我会尝试将所有特定于运动的内容保留在View定义中,因此搜索代码不需要有太多或任何特定的代码(可能知道如何链接到/nhl/players/player-name
vs,/nfl/...
或者您的应用可以执行此操作)。
表继承
表继承可以工作,但是非常复杂。我没有很多经验,实际上,我认为每次参与评估时,我们都会做一些简单的事情(就像我在这里建议的那样)。
因此,就我个人而言,我还没有找到为什么这样做会有用,但是也许有一个令人信服的用例(我不知道)证明了复杂性(例如,表继承比其他解决方案更好地解决了用例) 。
特定运动属性的单独表格
您可以创建一个players
表,该表具有所有运动的所有玩家共有的属性,然后创建另一组表nhl_players_details
,其中包含一个playerId和带有该玩家其他信息的列。如果有很多共同的属性,或者您对“所有运动的所有参与者”都有很多用法,那么这可能是有道理的。
运动特定属性的键值对
完全替代的方法:有一个players
表(再次,与像名共同属性),然后player_data
有表PlayerId
,Sport
,Attribute
,Value
。输入的属性名称将特定于运动。这样一来,您基本上可以在不修改架构的情况下添加新属性(当然,您的代码仍然必须知道如何加载/显示它们)。缺点是您失去一些完整性:值通常是一个字符串字段,因此您的应用程序代码将必须具有弹性,并处理将字符串value
转换为特定数据类型(如整数)的潜在失败。
这个概念当然可以应用于团队,游戏等。