我正在设计一个数据库并遇到了障碍。好吧,不仅仅是我不喜欢的东西。我将有多达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,更改它并重新加载它来更新表格会更容易。有什么想法吗?
答案 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个切换列。这是规范化,快速,节省空间和可扩展的。