MySQL中的哈希字符串

MySQL中的哈希字符串,mysql,sql,Mysql,Sql,MySQL中是否存在某种哈希字符串类型 假设我们有一张桌子 user | action | target ----------------------- 1 | likes | 14 2 | follows | 190 我不想将“action”存储为文本,因为它占用大量空间,而且索引速度很慢。行动可能是有限的(我猜最多50个行动),但可以在将来添加/删除。因此,我希望避免在PHP中按数字存储所有操作。我希望有一张透明的桌子 例如,上面的表将在内部存储为(1,1,14)、(2,

MySQL中是否存在某种哈希字符串类型

假设我们有一张桌子

user | action  | target
-----------------------
1    | likes   | 14
2    | follows | 190
我不想将“action”存储为文本,因为它占用大量空间,而且索引速度很慢。行动可能是有限的(我猜最多50个行动),但可以在将来添加/删除。因此,我希望避免在PHP中按数字存储所有操作。我希望有一张透明的桌子

例如,上面的表将在内部存储为(1,1,14)、(2,2190),键将存储在另一个表中(1=likes,2=follows)

这里“likes”解析为1

INSERT INTO table (23, "dislikes", 1245)
这里我们没有“不喜欢”的键,它被添加并作为3存储在内部

可能吗?

您需要一个名为“actions”的表和一个名为“action\u id”的外键。这就是数据库规范化的工作原理:

用户操作:

user | action_id  | target
-----------------------
1    | 1          | 14
2    | 2          | 190
行动:

id  | name    
--------------
1   | likes   
2   | follows 
至于让
插入到用户的动作中(1,'likes',47)
起作用:你不应该在意。试图使SQL变得漂亮是一种毫无意义的追求;实际上,您不应该在应用程序代码中编写任何代码。数据库交互应该由一层模型/业务对象来处理,它们的内部实现对您来说并不重要

至于将
插入到用户操作中(1,'不喜欢',47)
自动在
操作表中创建新记录:这同样不是数据库的工作。您的模型应该能够处理这个问题。

您需要一个名为“actions”的表和一个名为“action\u id”的外键。这就是数据库规范化的工作原理:

用户操作:

user | action_id  | target
-----------------------
1    | 1          | 14
2    | 2          | 190
行动:

id  | name    
--------------
1   | likes   
2   | follows 
至于让
插入到用户的动作中(1,'likes',47)
起作用:你不应该在意。试图使SQL变得漂亮是一种毫无意义的追求;实际上,您不应该在应用程序代码中编写任何代码。数据库交互应该由一层模型/业务对象来处理,它们的内部实现对您来说并不重要


至于将
插入到用户操作中(1,'不喜欢',47)
自动在
操作表中创建新记录:这同样不是数据库的工作。您的模型应该能够处理这个问题。

是的,子查询如下:

INSERT INTO table (23, (SELECT id FROM actions WHERE action="dislikes") , 1245)
通过这种方式,可以不知道PHP端的ID,而只知道操作名称,并且仍然将其作为ID输入数据库

这是假设您有一个“操作”表

id | action
-----------
1  | like
2  | dislike

是的,有这样一个子查询:

INSERT INTO table (23, (SELECT id FROM actions WHERE action="dislikes") , 1245)
通过这种方式,可以不知道PHP端的ID,而只知道操作名称,并且仍然将其作为ID输入数据库

这是假设您有一个“操作”表

id | action
-----------
1  | like
2  | dislike
如果有一组固定(或合理固定)的值,则可以使用枚举字段。这在内部实现为位掩码,因此占用少量磁盘空间。以下是一个示例定义:

CREATE TABLE enum_test (
    myEnum enum('enabled', 'disabled', 'unknown')
);
如果有一组固定(或合理固定)的值,则可以使用枚举字段。这在内部实现为位掩码,因此占用少量磁盘空间。以下是一个示例定义:

CREATE TABLE enum_test (
    myEnum enum('enabled', 'disabled', 'unknown')
);

嗨,米加,我知道!这正是我想要的。我可以很容易地创建一个视图,允许获取(1,“likes”,14)元组,但我也希望在编写时有类似的包装。嗨,meagar,我知道!这正是我想要的。我可以很容易地创建一个允许获取(1,“likes”,14)元组的视图,但我也希望在编写时使用类似的包装器。这很好。但我可以创建类似于视图的东西,允许我将
INSERT写入虚拟_表(23,“dislikes”,1245)
,并将其转换为您的示例吗?您可以使用存储函数,但这仍然意味着您必须以不同的方式编写它。您也可以使用PHP和正则表达式来更改它,但这不是您想要的方式。我认为这是最好的option@user1019812您可以做一些事情,将
插入到虚拟_表中(23,(从actions中选择id,action='dislikes'),1245)
您不需要存储函数,但在这种情况下使用存储函数可能更易于维护。这很好。但我可以创建类似于视图的东西,允许我将
INSERT写入虚拟_表(23,“dislikes”,1245)
,并将其转换为您的示例吗?您可以使用存储函数,但这仍然意味着您必须以不同的方式编写它。您也可以使用PHP和正则表达式来更改它,但这不是您想要的方式。我认为这是最好的option@user1019812您可以做一些事情,将
插入虚拟_表(23,(从actions中选择id,其中action='dislikes'),1245)
您不需要存储函数,但在这种情况下使用存储函数可能更易于维护。