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。
可能的?
答案 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
表中创建新记录:这也不是数据库的工作。你的模型应该处理这个。