db 모델링 - 사용자가 삭제되어도, 그 사용자와 관련된 이력은

lacovnk의 이미지

user테이블은 no,userid,password,name를 가집니다
record테이블은 sender, recver, data1... datan을 가집니다.

1. user가 탈퇴를 하더라도, record 테이블의 tuple은 그대로 둔다
2. recver가 메모를 볼때, sender를 클릭하면
a) 사용자가 존재하면 sender의 페이지가 뜬다.
b) 사용자가 존재하지 않으면 탈퇴한 회원이라고 알려주기

이렇게 구현하려고 합니다.

user테이블에서 userid를 pk로 하지 못하는 것은, 탈퇴한 회원의 id로 다른 회원이 가입할 경우 문제가 되므로... 안되고요.

아무튼..

그렇다면, data테이블에서는 foreign key로 user테이블의 no를 가리키고, on delete일때 not delete라고 해두면 되는 것이겠지요?

문제는, record테이블에서, user의 특정 정보를 가져야 할 경우입니다. 예를들어, record테이블을 사용할 때에는 user의 name도 사용한다고 칩시다.

만일 user의 name을 record table에 저장하지 않으면, user가 삭제되었을 경우 알수 없게 되어버리므로.. record table에 user의 name을 집어 넣어야 합니다.

하지만 그렇게 되면, "탈퇴하지 않은 회원"의 경우, user테이블의 name과 record테이블의 name의 일관성을 유지하는 app.의 로직을 추가하여야 합니다.

이를 모델 수준에서 해결할 방법은 없나요? 잘 떠오르지 않네요 orz

그리고, ERD에는 어떻게 표현을 해야 할까요? 그냥 foreign key로 놔두면 되나요? 음음..

atie의 이미지

원론적으로 이 경우는 fk로 처리를 하는 것이 보통이지만 이야기하신대로 특정 어플리케이션의 요구 사항에 따라 예외적(?) 처리를 하는 경우가 있게 됩니다. 위에 이야기한대로 이름을 sync하기 위한 코드가 필요한 경우가 되겠죠. 특별한 답이 없습니다. db 설계를 할 때 3차까지의 정규화를 적용하고, 경우에 따라 4차가 필요한지를 검토해 보시기 바랍니다.

그리고, 한 가지 힌트를 드리면 실무에서는 웬만한 자료들의 경우는 delete를 직접 테이블에 하는 것이 아니라, 상태 flag을 두고 삭제되었다고 표시만 합니다. 이걸 이용하면 탈퇴의 경우도 쉽게 처리를 하실 수가 있을 듯하고, 진짜 삭제하는 것은 별도의 프로그램에서 때 되면 백업받고 삭제하기 하는 편이 좋은 경우가 많습니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

익명 사용자의 이미지

atie wrote:

...

그리고, 한 가지 힌트를 드리면 실무에서는 웬만한 자료들의 경우는 delete를 직접 테이블에 하는 것이 아니라, 상태 flag을 두고 삭제되었다고 표시만 합니다. 이걸 이용하면 탈퇴의 경우도 쉽게 처리를 하실 수가 있을 듯하고, 진짜 삭제하는 것은 별도의 프로그램에서 때 되면 백업받고 삭제하기 하는 편이 좋은 경우가 많습니다.

good.

bear의 이미지

탈퇴한 회원을 정보를 유지 하셔야 한다고 이야기 하셨는데요..
그리고, 탈퇴한 회원의 아이디를 가지고 다른 사용자가 아이디를 생성 할수 있어야 한다고 하면, 위에서 말씀하신데로 flag 를 두고 체크 하고 사용 하면 될것 같습니다.
또한 탈퇴한 사용자의 글이나 기타 관련 정보들이 남아 있기 때문에 아이디가 노출되는것은 좀 문제가 있을듯 합니다.
또한 내부적으로 유니크한 값을 사용해야 하는게 맞을듯 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.