我如何规范化这个未规范化的数据库表?

时间:2016-11-01 19:47:38

标签: mysql database-normalization

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

+----+--------------+--------+--------+
| 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值,那么我的应用程序是否会受到影响?

1 个答案:

答案 0 :(得分:2)

以下是一种可能的解决方案:

<强>会话

id_session (PK)
session_type (Integer/Enum)

<强> cash_sessions:

id_session (FK)
stakes

<强> tournament_sessions:

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)

所以,而不是考虑&#34;会话类型&#34;您可以更改业务模型以考虑&#34;会话属性&#34;,因此,不同的会话可以分配不同的属性集

示例数据:

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