Сохранить в описании базы данных с числовым значением - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть такой текст как «описание», но некоторые значения являются числовыми и должны быть изменены в зависимости от соотношения.Мне было интересно, как правильно хранить это в базе данных.

"- Добавить 49 вещей в мои 7 сумок"

Моя первоначальная идея состояла в том, чтобы сделать это:

+-------+------+---------------+------+---------+------------+-----------+
| part1 | num1 |     part2     | num2 |  part3  |  rationum1 | rationum2 |
+-------+------+---------------+------+---------+------------+-----------+
| - Add |   49 | things  in my |    7 |    bags |        1.3 |       1.2 |
+-------+------+---------------+------+---------+------------+-----------+

Кажется, однако, очень неэффективно.Кроме того, я хочу добавить всплывающую подсказку о некоторых вещах.Например, «-Add» должен иметь связанную подсказку, но я не знаю, как применить свойство только к одной части таблицы.

Любые советы приветствуются!

РЕДАКТИРОВАТЬ: Я использую PHP для извлечения данных как JSON, а затем я использую JavaScript (React) для отображения.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Возможно, нормализуйте его.

Например, поместите описания с заполнителями в другую таблицу вместе со всплывающей подсказкой.

Затем поместите внешний ключ в таблицу с элементами.

Пример кода:

DROP TABLE IF EXISTS tst_stuff;
DROP TABLE IF EXISTS tst_stufftodo;

CREATE TABLE tst_stufftodo (id int primary key auto_increment, description varchar(100), tooltip varchar(1000));

CREATE TABLE tst_stuff (id int primary key auto_increment, name varchar(100), num1 int not null default 0, num2 int not null default 0, rationum1 decimal(4,1) not null default 0, rationum2 decimal(4,1) not null default 0, 
std_id int,
FOREIGN KEY (std_id) REFERENCES stufftodo(id)
);

INSERT INTO tst_stufftodo (description, tooltip)
VALUES 
('Add &num1& things in my &num2& &name&', 'Add the stuff');

INSERT INTO tst_stuff (name, num1, num2, rationum1, rationum2, std_id) VALUES
('bags', 49, 7, 1.2, 1.3, 1),
('socks', 1000000, 2, 0.5, 0.6, 1);

select s.id, replace(replace(replace(std.description,'&name&',s.name), '&num1&',s.num1), '&num2&',s.num2) as description
from tst_stuff s
join tst_stufftodo std on std.id = s.std_id;

Результат:

id  description
1   Add 49 things in my 7 bags
2   Add 1000000 things in my 2 socks

Но, вероятно, лучше сделать замену заполнителей на уровне представления PHP.

0 голосов
/ 10 февраля 2019

В предложенной вами схеме стола нет ничего плохого.Это также не неэффективно.MySql построен для этого.Он может обрабатывать миллионы строк такого рода, не потревожив.

Добавьте автоинкрементное значение id к каждой строке, чтобы использовать его в качестве первичного ключа.Вы можете также рассмотреть возможность добавления столбца метки времени.

Определите столбцы num1 и num2 как int или, если вам нужны дробные значения, как double.(Javascript обрабатывает все числа как двойные).

Определите ваши дробные столбцы как double.

Определите ваши текстовые столбцы как varchar(250) или что-то подобное, и добавьте текстовый столбец для вашеготекст всплывающей подсказки.

И все готово.

Но когда я смотрю на ваш пример Добавьте 49 вещей в мои 7 сумок Я вижубольше значения, чем просто фраза.

  • глагол: Добавить .
  • a source_count: 49
  • aописание источника: вещи .
  • предлог: в
  • притяжательное: my
  • atarget_count: 7
  • a target_description: сумки

Должна ли ваша система также сказать Украсть 5 гранат от Джо 2случаи боеприпасов или что-то в этом роде (я предполагаю, что вы делаете какую-то игру)?

Если это так, вы можете захотеть более сложный набор таблиц с учетом частей фразы,Тогда ваш запрос может использовать соответствующие операции JOIN.

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