我正在编程一个存储扑克会话数据的站点。会话是在赌场玩扑克的一段时间。会话包含诸如日期/时间,会话的净利润/损失以及它们播放的位置之类的信息。但是,我困惑的部分是如何处理会话类型。在扑克中,有两种游戏:现金游戏和锦标赛。每个都有各自只与它们相关的特定字段。这是一个示例表(我已经删除了不相关的字段):

+----+--------------+--------+--------+
| id | session type | stakes | buy-in |
+----+--------------+--------+--------+
|  1 | cash         | 1/3 NL | NULL   |
|  2 | cash         | 1/2 NL | NULL   |
|  3 | tournament   | NULL   | $20    |
+----+--------------+--------+--------+


如您所见,如果会话类型为现金,则不需要buy-in。同样,如果会话类型为锦标赛,则不需要stakes字段。

我该如何规范化我的表,使我没有NULL字段?从性能角度来看,如果我只是为了使该表标准化而使我的行中没有NULL值,那么我的应用程序会遭受损失吗?

最佳答案

这是一种可能的解决方案:

会话:

id_session (PK)
session_type (Integer/Enum)


cash_sessions:

id_session (FK)
stakes


比赛时间:

id_session (FK)
buy_in


因此,为每种会话类型使用单独的表,这样您就可以为不同的类型定义不同的列,并且在sessions表中也具有公共列

示例数据:

sessions
1 1
2 1
3 2

cash_sessions
1 1/3 NL
2 1/2 NL

tournament_sessions
3 $20


另一个解决方案:

会话:

id_session (PK)
session_type (Integer/Enum) <- basically useless field for this schema


属性:

id_attr (PK)
name (String)


session_attributes:

id_session (FK)
id_attr(FK)
value (String)


因此,您可以更改业务模型以考虑“会话属性”,而不必考虑“会话类型”,因此,不同的会话可以分配不同的属性集

示例数据:

sessions
1 1
2 1
3 2

attributes
1 stakes
2 buy_in

session_attributes
1 1 1/3 NL
2 1 1/2 NL
3 2 $20

10-04 11:29
查看更多