转换字段"键入"来自' int'到SQL数据库中的字符串

时间:2017-10-27 15:43:33

标签: sql node.js mariadb

问题:

我有一张如下图所示的狗桌:

CREATE TABLE dog (type SMALLINT, ...);

我想说我想从这个表中检索行并将此类型转换为具有语义的字符串,如下所示:

[{id: 1, type: 'brown'}, {id: 2, type: 'choco'}, ...]

而不是[{id: 1, type : 0}, {id: 1, type : 999}]

解决方案1:

创建另一个表格,如

CREATE TABLE dog_type (type SMALLINT, type_s string, ...);

缺点:每次我需要选择时加入。非常不愉快的方式。

解决方案2:

应用程序处理问题:

缺点:每次检索此信息时,我都需要".map()"行。

解决方案3:

只需在主表中将类型声明为字符串。

缺点:浪费了太多空间。

更多信息:

MariaDB投放nodeJS + ORM

有什么想法吗?或者你会选择哪一个?为什么?

3 个答案:

答案 0 :(得分:0)

我建议执行解决方案1(创建枚举表),然后创建一个为您执行连接的SQL视图。这样,您就可以保持表dog完整无缺,并且仍然可以针对新视图编写简单的select语句,以获得语义结果。

答案 1 :(得分:0)

如果你有一个包含Dogs的桌子,并且每只狗都有一个Type是有限数量的值之一(你给出的例子听起来更像是狗的颜色而不是类型,但这取决于你) ,然后一个关于狗类型的相关表是要走的路。

您提到的“con”必须“每次我需要选择时加入”表示缺乏对关系数据库如何工作的理解。除非您计划在整个数据库中只有一个表,否则表连接几乎是不可避免的,并且完全正常。如果在Dog Type表中创建主键列,在Dog表中创建外键列,这应该是一件小事。

您还没有提到您如何访问数据 - 您是否正在编写Web应用程序来检索数据?您是否在客户端应用程序中连接它?您使用的任何前端都可以设计为处理使用外键连接的表格,并且您根本不需要额外的工作。

答案 2 :(得分:0)

一个选项是可能在VIEW中的案例陈述:

DECLARE @dog TABLE ([type] SMALLINT, id int)
INSERT INTO @dog ([type], id)
VALUES (1,1), (1,2)
--just as an example table

SELECT [type]
      ,CASE WHEN id = 1 THEN 'brown'
            WHEN id = 2 THEN 'choco'        
       END AS [Fur Color]
 FROM @dog

但当然你不能做更新声明,你必须编辑视图来改变值。