Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 80 3列行或181列行_Sql_Mysql - Fatal编程技术网

Sql 80 3列行或181列行

Sql 80 3列行或181列行,sql,mysql,Sql,Mysql,我有一些数据要存储 我必须为每个用户存储这些数据 这些数据或多或少都是错误的 key: 0 value: 107, key: 1 value 213 每个用户大约有80个键/值集 所以我的问题是, 我有一排基本上是 user_id key1, key2... key80 或者我有80排 user_id, key, value 我必须存储的数据: 您可以看到我必须存储在此处的实际数据: 我不能只是复制/粘贴,因为它是大约8mb的数据,所以页面可能需要一段时间才能加载 但正如你所

我有一些数据要存储

我必须为每个用户存储这些数据

这些数据或多或少都是错误的

key: 0  
value: 107,

key: 1  
value 213
每个用户大约有80个键/值集

所以我的问题是,

我有一排基本上是

user_id key1, key2... key80
或者我有80排

user_id, key, value

我必须存储的数据:
您可以看到我必须存储在此处的实际数据:

我不能只是复制/粘贴,因为它是大约8mb的数据,所以页面可能需要一段时间才能加载

但正如你所看到的,我得到的是这种格式的数据,
因此,我必须以这种方式存储它。

我会远离数据库表中的81列,尤其是对于这样的情况,在这种情况下,将来可能会添加更多的“键”(在这种情况下,您必须向表中添加更多列)


“键值”表可能会导致性能问题,并使编写查询变得笨拙,因此,看看您是否能够以某种方式将键值分组到相关的部分,然后将这些部分塞进更小、更具体的表中,这可能是有利的。

您应该使用第一种方法—一行查询

user_id | key | value

这样,当每个用户需要更多/更少的密钥时,您就更加灵活了。

Pro 80 colums

  • 用户创建时插入一条,修改时仅更新语句
  • 可以使用简单的SELECT语句比较两个或多个键的值(不使用自联接)
  • O/R映射只是开箱即用
  • 数据库可以处理类型检查
Pro 80行

  • 添加键只是一个插入,不需要更改表(这意味着如果有大量用户,更新时会有很长的停机时间)
  • 插件可以很容易地添加自己的配置设置(在密钥名称中使用某种前缀以避免冲突)
关于80行的评论

  • 如果您使用这种方法,我建议使用“key_id”而不是“key”,并为key创建第二个表,以便验证key名称。该表可以有第三列用于文档

一想到表中有81列,我通常会畏缩。但是,如果:

  • 键/字段的数量不太可能更改,并且
  • 所有字段直接与用户相关,并适用于每个用户,和/或
  • 您可能需要为给定用户一次查询多个密钥
然后,拥有这么多的列比将每个用户/键组合存储为自己的行更有意义。您可以获得类型安全性、更好地约束和索引数据的能力,并且可以查询用户的统计信息,而不需要十几个联接(或返回一组需要组装到数据结构中的行)


如果字段的数量不断变化,或者字段不适用于每个人(即:某些用户的字段数量不同),或者您永远不想知道超过用户3225的字段53的值,那么用户/键/值表就更有意义。但要保持所有内容都正确,这将是一件痛苦的事情,更新将花费永远的时间(因为索引需要重做,而您需要索引),如果您一次需要一个或两个以上的字段,查询将变得非常糟糕。

我查看了数据。您为什么考虑将数据存储在数据库中?我想您想读取数据,运行一些算法,然后计算结果,对吗?或者实际上需要永久存储数据或这就是你想要做的一切吗

您的列表似乎都具有以下格式:

[KillsByEnemyTypeClass] => Array
                    (
                        [0] => stdClass Object
                            (
                                [Key] => 0
                                [Value] => 0
                            )
                        ...


[MedalCountsByType] => Array
                    (
                        [0] => stdClass Object
                            (
                                [Key] => 0
                                [Value] => 0
                            )
正如数据格式所暗示的,列表是连续的数组,而不是真正的键值对。因为键都是连续的,所以您可以在选择的编程语言中将值存储在一个大数组中

这是您的数据格式:

struct Data {
    std::string reason;
    int status;

    struct AiStatistics {
         int aDeathsByDamageType[82];
         int nHopperId;
         int aKillsByDamageType[82];
         int nMapId;
         double fMedalChestCompletionPercentage;
         int aMedalCountsByType[128];
         int nTotalMedals;
         int nVariantClass;
         ...
    } aaistatistics[9]; 
}
看起来阵列必须具有静态大小,因为82种不同的损伤类型可能对你有意义。如果突然出现83种损伤类型,生成此数据的程序将发生变化,你也必须调整算法。这意味着数据和程序不是独立的,并且f使用数据库是有问题的

更新

感谢您澄清您的要求。我理解您为什么现在必须为其他客户端缓存数据

<> >:你是否链接到所有要存储的数据?这意味着,你只缓存来自Web API的输出,如果输出改变了你以前存储的数据的覆盖?或者有一个时间维度,你想存储API的输出序列吗?在这两种情况下,一个瘦的二进制数据周围的C++ API可能是很多的。比数据库更高效

如果只是为了缓存数据,我仍然建议按照上面的对象模型对数据库进行建模。AI统计表中每个成员变量有一列,即一列用于完整的DeathsByDamaGetType数组。将整个数组存储为一个值。客户端无法使用此模型查找单个值,但必须接收com请使用数组。除非您有其他任何具体的用例,否则我将坚持使用它。您的数据库将更简单

如果这真的、真的、真的不足以满足您的目的,那么您的表可能是:

table Data { id, reason, status }
table AiStatistics { id, data_id, ..., all integer members like nTotalMedals etc }
table DeathByDamageType { aistat_type, index, value }
table ... for every other array member of AiStatistics
默认情况下,以这种方式存储DeathByDamageType实际上是空间效率低下的,表至少比数组值大三倍,因为对于每个值,必须分别存储AiStatistics引用id和数组索引


如果这样做,至少要利用数组中的稀疏性,不要在DeathByDamageType中存储0的值。你不能对数组执行此操作。

你能为表发布CREATE TABLE语句吗?如果可以,他已经决定了表格式并为其编写了SQL。:)@小马我还没有创造它,这是我的d