更好的数据库设计?

时间:2009-07-25 21:36:28

标签: mysql database-design

我正在设计一个数据库并遇到了障碍。好吧,不仅仅是我不喜欢的东西。我将有多达1000个不同的场景,在每个场景中,我将需要存储64个不同切换中的每一个的状态。我已尽力解决这个问题并提出以下建议:

Table Scenario

Scenario_ID
Scenario_Name


Table Toggles

Scenario_ID
Toggle_1
Toggle_2
...
...
Toggle_64

这让我有一个65行的Toggles表。我一直认为必须有一个比64列“开”或“关”更好的方法,但我不知道它可能是什么。我不想将切换状态存储在一列中的CSV中,因为它会不断变化,需要经常进行解析。通过简单地将Toggle_14更新为“关闭”而不是解析CSV,更改它并重新加载它来更新表格会更容易。有什么想法吗?

6 个答案:

答案 0 :(得分:6)

使用多对多关系:

Table Scenario (Id, Name)


Table ScenarioToggles (ScenarioId, TogglesId, ToggleState)


Table Toggles (Id, ToggleName)

ScenarioToggles表中的字段ToggleState将保持On / Off值。

如果您需要超过64次切换,它还可以提供一些灵活性。

答案 1 :(得分:3)

MySQL的BIGINT类型恰好是64位,因此您可以使用它在bit field中存储多达64个标志。从技术上讲,这会打破第一个正常形式(每列只有一个值),但如果1)你永远不会有超过64个标志,那么这很好,2)你总是以组的形式检索标志。

或者,您可以将每个标志存储在单独的行中,例如:

        composite key
    =====================
    Scenario_ID Toggle_ID Value
         1          0       0
         1          1       1
         1          2       1
       (...)
         1         63       0
         2          0       1
       (...)

这种方式更具可扩展性,可以更轻松地处理查询中的单个标志,但如果在应用程序中将它们全部作为一组处理,您将一次检索64行。

答案 2 :(得分:1)

您可以像这样设计Toogles表:

Scenario_ID
Toogle_nr
Toogle_state

并为每个方案获得64个条目。

但是,如果toogles计数不会经常变化,并且在每种情况下你都需要所有的toogles,你的解决方案似乎是最好的和最简单的。

答案 3 :(得分:1)

这是一种黑客攻击(有点像,有点),但根据您的查找要求,您可以只存储一个64个字符的字符串,您可以使用您选择的编程语言作为数组访问它。

然而,这样做的许多很多缺点可能超过了好处。 (然后,在数据库中存储64位可翻转状态信息首先是一个非常奇怪的要求。)

答案 4 :(得分:1)

由于您的问题标记为“mysql”,我建议您使用the SET type。更新记录到切换值可能有点棘手,因为MySQL本身并没有为此目的提供功能(在MySQL的bug跟踪器中搜索REMOVE_FROM_SET以获得解决方法。)另一方面,它非常紧凑并且不需要您可以为每个SELECT查询加入64个表或使用聚合函数。

答案 5 :(得分:1)

有些人只是想变得过于聪明。使用一个表,包含方案ID,名称和64个切换列。这是规范化,快速,节省空间和可扩展的。