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