Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
Database design 在Firebird中使用VarChar或Char代替整数时的性能、空间和其他观察结果_Database Design_Primary Key_Firebird_Database Performance_Sqldatatypes - Fatal编程技术网

Database design 在Firebird中使用VarChar或Char代替整数时的性能、空间和其他观察结果

Database design 在Firebird中使用VarChar或Char代替整数时的性能、空间和其他观察结果,database-design,primary-key,firebird,database-performance,sqldatatypes,Database Design,Primary Key,Firebird,Database Performance,Sqldatatypes,我经常使用Integer类型的列来指定某个记录的“类型”,所以0=TypeA,1=TypeB等等。我可以在列描述中添加翻译,但值本身并不是真正的人类可读的。此列也可以编制索引 另一种情况是,有时记录有一些简短的唯一字母数字字符串作为标识符。此外,我还添加了一个整数ID作为主键(对于该名称,只有一个唯一的索引),因为出于性能原因,我被告知主键永远不应该是字符串。在我从名字中得到ID后,我会尽可能地使用它 所以问题是,在可以使用整数的地方,你能告诉我关于直接使用字符串的性能、空间和其他观察结果吗?这

我经常使用
Integer
类型的列来指定某个记录的“类型”,所以0=TypeA,1=TypeB等等。我可以在列描述中添加翻译,但值本身并不是真正的人类可读的。此列也可以编制索引

另一种情况是,有时记录有一些简短的唯一字母数字字符串作为标识符。此外,我还添加了一个
整数
ID作为主键(对于该名称,只有一个唯一的索引),因为出于性能原因,我被告知主键永远不应该是字符串。在我从名字中得到ID后,我会尽可能地使用它

所以问题是,在可以使用整数的地方,你能告诉我关于直接使用字符串的性能、空间和其他观察结果吗?这些字符串可以很短,比如8个字符或更少,7位ASCII就足够了

这个问题主要针对Firebird 3.0,但我也对一个一般规则非常感兴趣,或者Firebird与其他数据库(如MSSQL)的比较


这个问题不是关于使用自然主键而不是代理主键。

没有可靠的规则,这将始终是一种权衡。不要泛化太多,考虑用例、易用性和潜在开销

整数数值通常是首选的,因为它们会导致较小的索引。Firebird中的数字索引(64位整数除外)使用64位双精度,这意味着(忽略前缀和后缀压缩等优化),数字索引中的条目将为8字节

对于字符,它将是字符集中以字符数表示的最大声明长度x每个字符的最大字节数,因此
CHAR(8)字符集UTF8
将消耗8x4=32字节,而
CHAR(8)字符集WIN1252
将消耗索引中的8x1=8字节(再次忽略某些优化)

换句话说,如果使用单字节字符集时使用的字符串不超过8个字符(在本例中,即使像ASCII这样的7位字符集也将使用完整字节!),则使用整数或字符串值之间不会有显著差异

此外,如果主键将被另一个表中的外键作为目标,并且您使用了代理项,那么现在只需要添加一个联接,以便能够查找该代码,而如果您直接将其用作主键,则该联接将立即可用。必须进行额外连接的性能影响可能超过使用代理的任何预期性能“好处”

与软件开发中的一切一样,这是一种权衡。如果字符串代码仍然很小,比如8个或更多字符,并且您知道字符串代码不需要更改(层叠更新等),那么请务必选择字符串代码


另一方面,如果字符串代码需要定期更改(这将导致级联更新),请使用代理。如果字符串代码大于16字节,请考虑实现这两个字节并执行实际的(!)性能测试。如果字符串代码很长(比如50个字节或更长),请倾向于使用代理。

我可以在列描述中输入翻译,也可以使用字典表。你甚至可以把外键放进去。但它也有性能权衡<代码>使用一些简短的唯一字母数字字符串作为标识符
-此标识符是否来自外部世界,来自“业务域”?如果是这样,你就进入了“真实PK与人工PK”的火焰战。从我个人的例子来看,我在做一个内部的小公用设施。对于客户,表I选择INN(合法唯一纳税人识别号)作为PK。“可能会出什么问题……”。事实证明,在部署之后,一些天才游说说,同一家银行的不同办事处将拥有同一家旅馆,尽管有时位于不同的城市(地点是旅馆的一部分)。另一个打击是,我们发现有一些外国客户拥有不同的税务id模式。此外,各州内部可能存在唯一的不同税号,可能会发生全面冲突。因此,简而言之,我必须紧急地将生产中的系统从“realpk”(VarChar(11))重新改造为非常抽象的整数。在消除冗余方面节省开支的尝试突然让我感到完全缺乏灵活性