Kpegumop, можно по другому, менее велосипедный путь
* с другого вм сайта на мыслю натолкнули
soyz2o12, имея всего лишь файл для записи, который нужно разрешить изменять 10 раз, других путей, лично я не вижу
Привет всем, помогите решить, как лучше организовать хранение и вывод прикреплённых файлов на php+sql. Т.е. пользователь может прикреплять любое количество файлов к сообщению.
Итак, есть таблицы:
users (id | login)
mail (id | author | files) -- в поле `files` сейчас хранятся id прикреплённых файлов из таблицы `files`, разделённые пробелами
files (id | filename)
В принципе, есть в уме рабочий вариант, но он напрягает по затратам. Т.е. в цикле выводятся все сообщения, а внутри вывода каждого сообщения есть цикл, разбирающий строку `files` и делающий кучу выборок из таблицы `files`. Т.е. если на странице 10 сообщений и у каждого сообщения 10 прикреплённых файлов, то получается, что делается 110 выборок. Круто, да? В общем, подскажите, кто что может, пожалуйста.
P.S. Хранить в таблице сообщений сами имена очень не хочется. Шардинг в планах, но принципиально проблему не решает.
soyz2o12, можно в sqlite-таблице или обычном файлике хранить кол-во изменений.
Hipsta, добавь в таблицу еще номер письма, в файлов таблицу пиши все файлы как отдельная запись, посчитать количество файлов по номеру письма не проблема, зачем пробелом разделять, одна запись один файл, так и отдавать проще будет
Hipsta, из писем убрать поле для файлов оно там не нужно вовсе
select * from mail join files on mail.id = files.post_id
достанет все сообщение и файлы в один запрос
# Hipsta (02.10.2013 / 01:06)
Привет всем, помогите решить, как лучше организовать хранение и вывод прикреплённых файлов на php+sql. Т.е. пользователь может прикреплять любое количество файлов к сообщению.
Итак, есть таблицы:
u
Можно сделать что бы в конце сообщения при загрузке добавлялся ббтеги например [file=file.zip][file=file1.zip][file=file2.zip]
и обрабатывать это функцией ббтегов и не надо будет ни таблицы ни запросов с джойнами
Krite, хороший вариант в плане производительности и удобства. Можно прикреплять чужие файлы, что заставляет склониться к этому варианту. Спасибо. Недостаток лишь в переименовывании файлов. Например, если я переименую файл на диске, то мне придётся искать этот файл по сообщениям. Но это случай 1 на тысячу.
Koenig, я что-то совсем забыл про этот вариант (начал придумывать уже на со грядущий), тоже хорошая идея, хоть и не без недостатков -- таблица быстро разрастётся и нужно думать, как расширять (`files_0`, `files_1`, ...) Спасибо.
Ещё раз продумаю, что всё-таки мне больше подходит.
Hipsta, мне кажется что из за фанатичной оптимизации, про удобство забываем ) я не заморачивался б с количеством запросов и писал бы прикрепленные файлы в отдельную таблицу с идентефикатором сообщения. на край можно при получении сообщений получить количество прикрепленных файлов и если больше одного, давать ссыль на отдельную страницу, где и вывести список файлов(избавляемся от цикла в цикле). Ну и у себя например я сделал эти файлы временными. удаляю их через неделю. сообщения, это не файлохранилище )) отдал файл и хорош.
Kpegumop, я хочу написать, чтобы работало и для личной переписки, и для форума одинаково, поэтому удаление временных файлов для меня не подходит. В принципе, предложение Krite мне нравится, я просто в поле `messages`.`files` буду хранить список имён файлов.
мне кажется что из за фанатичной оптимизации, про удобство забываем
Как истинный лентяй, я ищу золотую середину, так как пренебрежение оптимизацией может ещё аукнуться.