Mysql 定义一个;伪;列,它是selects的char列的子字符串()

Mysql 定义一个;伪;列,它是selects的char列的子字符串(),mysql,sql,postgresql,Mysql,Sql,Postgresql,使用Postgres和/或Mysql(最新版本),我在一个表中有一个列,它是一个唯一的键,是一个char列,包含例如date(8)、branch(6)、cashier(6)、operator(6)、sequence(6)、reversion(1)。这些都是数值。我这样做是因为我认为插入比为这些字段使用单独的列创建复合唯一键更有效。我的主要问题是是否可以将一种伪列定义为子字符串()以允许仅使用列名来定义例如“运算符”的选择另一种选择是在select语句中使用substring(),这对于特殊查询有

使用Postgres和/或Mysql(最新版本),我在一个表中有一个列,它是一个唯一的键,是一个char列,包含例如date(8)、branch(6)、cashier(6)、operator(6)、sequence(6)、reversion(1)。这些都是数值。我这样做是因为我认为插入比为这些字段使用单独的列创建复合唯一键更有效。

我的主要问题是是否可以将一种伪列定义为子字符串()以允许仅使用列名来定义例如“运算符”的选择

另一种选择是在select语句中使用substring(),这对于特殊查询有点麻烦。

另一种选择是,如果复合唯一键同样有效(对于插入),我可以使用它。

表的容量将非常大,但仅用于插入和选择。选择将主要在主键上,主键由帐号(int)和交易号(int)组成。

三元组{branch,cashier,operator}看起来可疑,可能会违反BCNF。出于性能原因,我认为您应该先取消数据模型的规范化,然后再取消数据模型的规范化

{date,branch,sequence}在我看来像是一个自然的PK(三分之二是保留字)


作为答案发布(抱歉,我还不能发表评论)

当您在上周和前一周之间的“日期”时突然发现需要更新“操作员”时,今天看来有效的内容明天可能会成为问题。您是否实际运行了一些测试来检查性能?您确定使用此方法将获得更高的性能吗?永远不要将不同的信息组合到一个列中。永远不要将日期或数字存储为字符值。在MySQL中使用子字符串进行查询的成本非常高,因为它不允许基于函数的索引(也不允许虚拟列)。在Postgres,你可以对子字符串表达式进行索引,但我仍然认为它是一个黑客,而不是一个坚固的设计。我同意它并不漂亮,而且它还没有具体化。然而,如果速度快得多,最终可能会证明方法是正确的。不过,我知道解决方案应该是优雅的,所以我会尝试寻找替代方案。其目的是确保外部密钥(如图所示)不重复。