我有一张如下图所示的狗桌:
CREATE TABLE dog (type SMALLINT, ...);
我想说我想从这个表中检索行并将此类型转换为具有语义的字符串,如下所示:
[{id: 1, type: 'brown'}, {id: 2, type: 'choco'}, ...]
而不是[{id: 1, type : 0}, {id: 1, type : 999}]
创建另一个表格,如
CREATE TABLE dog_type (type SMALLINT, type_s string, ...);
缺点:每次我需要选择时加入。非常不愉快的方式。
应用程序处理问题:
缺点:每次检索此信息时,我都需要".map()"
行。
只需在主表中将类型声明为字符串。
缺点:浪费了太多空间。
MariaDB投放nodeJS + ORM
有什么想法吗?或者你会选择哪一个?为什么?
答案 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
但当然你不能做更新声明,你必须编辑视图来改变值。