#mysql
#mysql
Вопрос:
Мне нужно разработать международный веб-сайт. Допустим, у меня есть таблица под названием Article:
articleID | data | text_EN | text_FR | text_DE | text_ES
Как вы можете видеть, одна строка содержит каждую переведенную версию текста. Учитывая, что каждое текстовое поле для каждого языка содержит около 1500 символов, у mysql могут возникнуть какие-либо проблемы с управлением такой таблицей?
Однажды я слышал, что существует жесткое ограничение на то, сколько места может занимать одна строка.
Комментарии:
1. Что происходит, когда вам нужно добавить другой язык? Вы изменяете таблицу?
2. ДА.. Таким образом, я могу получить более простой запрос, чем объединение с таблицей, содержащей 1 язык для каждой записи
3. Это плохой подход к разработке вашего приложения подобным образом..
4. В данном случае я чувствую себя совершенно комфортно только при таком подходе. И это не похоже на то, что я добавляю язык каждый день. 🙂
Ответ №1:
В MySQL действительно существует ограничение на размер строки (64 КБ для MyISAM, около 8 КБ для InnoDB IIRC), но это не будет иметь большого значения, если вы используете поля TEXT
или BLOB
.
Такие поля на самом деле являются указателями, сами данные хранятся за пределами строки. Каждое TEXT
поле будет занимать от 9 до 12 байт места в строке, в соответствии с требованиями к хранению.
Тем не менее, я бы поддержал совет @ Bill: переводы статей лучше хранить в строках, а не в столбцах.
Комментарии:
1. Скорее всего, нет, поскольку ваши пять
text_XX
полей займут не более 60 байт памяти строки.
Ответ №2:
Хорошо, насколько я знаю, у всего есть свой предел.
Вы можете найти больше информации здесь.
http://www.electrictoolbox.com/maximum-length-mysql-text-field-types/
Но я думаю, что проблема будет решена, когда вы прочтете это.
Ответ №3:
Описать ограничение длины строки сложно. Подробности смотрите в этом блоге: Хранилище больших двоичных объектов в InnoDB.
Но я бы настоятельно рекомендовал вам не сохранять текст в таких столбцах. Хранить в строках вместо:
CREATE TABLE Article (
articeID INT NOT NULL AUTO_INCREMENT,
language CHAR(2) NOT NULL,
article_text TEXT,
PRIMARY KEY (articleID, language)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Комментарии:
1. эта конкретная таблица не может работать для меня, потому что мне нужно сохранить другое поле, слишком независимое от языка, и это приведет к избыточности. Если я хочу нормализовать свою схему, я должен создать вторую таблицу, содержащую только переведенный текст, но это вызвало бы более сложный запрос, а я хочу, чтобы запрос был как можно более простым.