Хешированная строка в MySQL - PullRequest
0 голосов
/ 11 ноября 2011

Есть ли какой-нибудь тип хэшированной строки в MySQL?

Допустим, у нас есть таблица

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

Я не хочу хранить "действие" как текст, потому что онозанимает много места и медленно индексируется.Действия могут быть ограничены (я думаю, до 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 ]

2 голосов
/ 11 ноября 2011

Если у вас есть фиксированный (или разумно фиксированный) набор значений, то вы можете использовать поле enum. Это реализовано как внутренняя битовая маска и в результате занимает мало места на диске. Вот пример определения:

CREATE TABLE enum_test (
    myEnum enum('enabled', 'disabled', 'unknown')
);
1 голос
/ 11 ноября 2011

Да, с таким подзапросом:

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

Таким образом, можно не знать идентификатор со стороны PHP, а только имя действия, и при этом вводить его в базу данных как идентификатор

Это при условии, что у вас есть таблица "действий"

id | action
-----------
1  | like
2  | dislike
0 голосов
/ 11 ноября 2011

Вам нужна таблица с именем "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:Это опять не работа базы данных.Ваши модели должны справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...