mysql에서 자료 저장문제..

arboris의 이미지

게시판에서 첨부파일로 올라온것을 특정한 디렉토리에 저장하고 경로만 db에 넣을까 아니면 db에 바로 넣을까 고민중입니다.
생각나는 단점은 db가 무지 커지겠구나 하는 거외에는 없습니다.
관리는 오히려 쉬울듯 하고요.
혹시 아시는 장단점 있으시거나 추천하시는 것이 있으면 알려주시면 감사하겠습니다.

lacovnk의 이미지

전송해줄때 파일명 지정해주면 되니

그냥 적당한곳 (게시판별로 나눈다든지..) 에 적당한 이름 (게시물이나 시간 등등으로..) 을 붙여놓으면 어떨까요?

예전에 올렸다가 별 반응없이 끝난 주제이기도 하군요 ㅎㅎ

동일한 파일명 문제...를 올렸었거든요;

orangecrs의 이미지

대부분 경로만 지정해서 올립니다. 그러는 이유는 여러가지... 8)
대표적으로 APM 환경에서 아파치의 Request time out의 시간조절이
mysql과 별개로 돌아가기 때문에 특정한 이유로 DB에 저장되고 있는 도중에
아파치설정에 의해 접속이 끊겨버리는...
이런경우 작은 이미지파일의 경우라도 접속량이 많아지면 무쟈게 돌더군요... 에러도 많이 나고...
그래도 접속많지 않은 개인적인 목적으로 쓸수 없을까 해서... 졸업한 학교에서 계정 용량보다 DB 용량을 많이 줘서 시도해 보기도 했는데
역시나 였습니다.

lacovnk님이 말씀하신 동일한 파일명문제는 얼마든지 극복 가능한문제인데
혹 어떤 문제인지 말씀해 주시면 감사하겠습니다.

---------------------------------------------------
야!...

sh.의 이미지

저같은 경우는...
해당 자료(예를 들어 게시물?)의 PK값으로 파일명을 변환해서 저장하고
db에는 원래의 파일명을 저장합니다...

arboris의 이미지

이런 주제가 또 있었군요.
나름대로 검색을 해보았는데, 죄송합니다.
말씀하신대로 파일이름이 같을 경우가 가장 걸립니다.
xoops라는 포털프로그램을 쓰고있는데, 자료실 업로더 프로그램이 이름이 같으면 덮어써 버리더군요.
orangecrs님 친절하게 설명해 주셔서 감사합니다.
실력은 딸리지만 그 프로그램을 분석해서 bs0048님 아이디어를 적용해야 겠군요.
그런데 pk값은 뭔가요. 저는 파일이름뒤에 시간함수를 통해서 시간을 붙일까 생각중인데요.

우분투가 좋아요.

sh.의 이미지

pk값은.. 역시 게시판을 예를 들어 설명하자면
게시판에 db에 저장될때 uid같은 Primary key로 잡힌 값을 말한거구요...

파일명이 같을경우에 덮어쓰는 문제는
저장할때 제가 말씀드렸던것처럼 pk값으로 파일명을 변경하는 방법도 있고
파일의 md5 hash값으로 저장을 하는 방법도 있습니다..

그리고 시간을 붙이는 방법은 같은 시간에 파일이 등록될수도 있고
저는 좀 깔끔하지 않은 방법이라고 생각하구요^^

ironiris의 이미지

업로드하는 사람의 IP문자열+시간+파일명을 더한 문자열을 base64로 인코딩해서 저장하는 것이 좋을것 같습니다.
같은 IP에서 같은 시간에 같은 파일명을 업로드 하는 경우는 없을거라 봅니다.
파일의 hash값을 이용하는 것은 용량이 크면 hash값을 얻어내는 것도 일이라고 봅니다.

sh.의 이미지

ironiris wrote:
업로드하는 사람의 IP문자열+시간+파일명을 더한 문자열을 base64로 인코딩해서 저장하는 것이 좋을것 같습니다.
같은 IP에서 같은 시간에 같은 파일명을 업로드 하는 경우는 없을거라 봅니다.
파일의 hash값을 이용하는 것은 용량이 크면 hash값을 얻어내는 것도 일이라고 봅니다.

그런 문제때문에 pk값으로 변경하는걸 추천합니다 :)

익명 사용자의 이미지

그냥 단순하게

pk___파일이름

이런식으로 간단하게 해결했던 경험이 있습니다

익명 사용자의 이미지

pk 값은 어떻게 구하나요?
그러니까 먼저 게시물을 저장한 후에 pk 값을 구해서 진짜 화일 이름을 db에 modify 를 이용해서 저장해 주는 건가요?

pk 구하는 쿼리와 화일 이름 저장하는 절차가 어떻게 되나요?

sjpark의 이미지

전 DB에 바로 저장합니다.

그림파일, MP3, PDF 등을 모두 DB에 저장합니다.

업로드 사이즈도 8메가 바이트로 늘려 놓았구요.

괜찮습니다. 다만, 클라이언트에서 캐슁을 못하기 때문에, 이미지 같은 경우
같은 페이지더라도 계속 DB에 다시 쿼리를 보내기 때문에 좀 답답하더군요

하지만 이것도 썸네일 생성법을 익힌다면 더 낳아질 것이라고 봅니다.
전 아직 썸네일 생성법을 몰라서요.

혹시 DB에 저장된 이미지에서 바로 썸네일을 만들어 별도로 저장하는법을
아시는 분 귀뜸좀..

아.. 지금 쓰다보니 문득 떠올랐는데,
디비에 넣기 전 잠시 파일로 존재할때, 그 파일을 가지고 썸네일을 만들어
저장시키면 되겠군요:) 그런데 이미 수십장을 업로드한 상태라, 썸네일
만들어 내려면 미치겠군요.

참, 다시 원래의 이야기로 돌아가서, 장점과 단점을 나누어 설명드릴께요
직접 쓰고 있으니.. 느낌 그대로.

장점은 관리가 무척 쉽다는 것입니다. 아무나(로그인하지 않은 사람) 다운 받아가지 못하게 할 수 있구요, 자료에 대한 접근 기록도 좀더 쉽게 남길 수 있습니다. 뭐.. 그외 DB의 장점을 모두 갖게 되지요.

단점은 대용량의 경우, 목록 추출에 시간이 걸립니다. 파일 이름만 가지고 목록을 추출하려고 해도, 디비가 약간 버벅 대더군요. 그래서 웹페이지에서 데이타 관리할 때에는 좀 깝깝하기도 합니다.

그래도, 이미지가 아닌 경우라면 DB관리를 추천합니다.
앞서 임베디드 같은(=0=)데서 쓰일리 없다면요(흠.. 임베디드까지 생각하게 될 줄이야..ㅋ)

물론 이미지도 꽁수로 DB에서 관리하게 할 수 있죠. 클라이언트 속도 문제 없이(앞서 말한 썸네일같이..)

그럼 도움이 되셨길..

sh.의 이미지

eeee wrote:
pk 값은 어떻게 구하나요?
그러니까 먼저 게시물을 저장한 후에 pk 값을 구해서 진짜 화일 이름을 db에 modify 를 이용해서 저장해 주는 건가요?

pk 구하는 쿼리와 화일 이름 저장하는 절차가 어떻게 되나요?

저는 가능하면 pk를 정수로된 필드로 주기 때문에

- 일단 db에 저장(원본의 파일명은 이때 기록)
- 방금 넣은 pk를 구함(mysql에서는 last_insert_id로)
- file을 move / rename

이렇게 합니다..

fender의 이미지

데이터베이스로 업로드/다운로드를 구현할 때 가장 큰 문제점은 사용 가능한 데이터베이스 커넥션 수가 모자라 성능에 영향을 줄 수 있다는 점입니다.

사실 한 건의 업로드나 다운로드만 보면 디비나 파일 시스템이나 별반 차이는 없습니다. 하지만 대부분의 규모 있는 사이트가 커넥션 풀을 활용해서 데이터베이스 접속을 풀링한다고 보면, 하나의 리퀘스트가 한 데이터베이스 접속을 반환하지 않고 작업하는데 걸리는 시간 동안 다른 리퀘스트는 해당 접속을 사용할 수 없게 됩니다. 즉, 커넥션 풀에 20개의 접속을 할당 했다면 이 사이트는 한번에 20명만 다운로드를 받으면, 다운로드가 끝날 때까지 데이터 베이스와 관련된 어떠한 페이지도 서비스 할 수 없게 되어 버립니다. 반면 예를들어 일반적인 게시판이라면 똑같이 게시물 목록 페이지를 20명이 동시에 접속했다고 해도 실제 쿼리에 필요한 시간은 대부분 1초를 넘지 않고 설사 20명이 똑같은 시간에 해당 쿼리를 실행해도 다른 사람들은 최대 1초만 기다리면 해당 페이지를 볼 수 있기 때문에 별 문제가 되지 않습니다.

물론 서블릿 필터 등을 사용해서 데이터베이스의 내용을 파일로 저장하는 방법도 있지만 위와 같은 문제에 대한 근본적인 해결책은 아닙니다.

결론적으로 가능하면 용량이 큰 컨텐트를 데이터베이스로 관리하는 데는 상당한 위험부담이 있고, 일반적으로 검색이 많은 경우는 데이터베이스가, 전송량이 많은 경우는 파일시스템을 활용하는 것이 더 바람직한 설계라고 봅니다.

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.