MySQL中的哈希字符串

时间:2011-11-11 14:45:17

标签: mysql sql

MySQL中是否有某种散列字符串类型?

假设我们有一张桌子

user | action  | target
-----------------------
1    | likes   | 14
2    | follows | 190

我不想将“action”存储为文本,因为它需要很多空间并且索引很慢。动作可能会受到限制(我猜最多50个动作)但可以在将来添加/删除。所以我想避免在PHP中按数字存储所有操作。我想有一个透明处理这个问题的表。

例如,上面的表将在内部存储为(1,1,14),(2,2,190),并且键将存储在另一个表中(1 =喜欢,2 =跟随)。

INSERT INTO table (41, "likes", 153)

这里“喜欢”被解析为1。

INSERT INTO table (23, "dislikes", 1245)

在这里,我们没有“不喜欢”的关键,它被添加并在内部存储为3。

可能的?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

是的,有这样的子查询:

INSERT INTO table (23, (SELECT id FROM actions WHERE action="dislikes") , 1245)

这种方式可能不知道PHP端的ID,只知道动作名称,仍然在数据库中输入ID作为ID

这假设你有一个'行动'表

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

答案 2 :(得分:0)

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

user_actions:

user | action_id  | target
-----------------------
1    | 1          | 14
2    | 2          | 190

动作:

id  | name    
--------------
1   | likes   
2   | follows 

使insert into user_actions (1, 'likes', 47)工作:你不应该在意。试图让你的SQL漂亮是一个毫无意义的追求;你永远不应该在你的应用程序代码中写任何东西。数据库交互应由一层模型/业务对象处理,其内部实现对您来说无关紧要。

使insert into user_actions (1, 'dislikes', 47)自动在actions表中创建新记录:这也不是数据库的工作。你的模型应该处理这个。