저는 소프트웨어 개발자입니다. 코딩을 좋아하지만 데이터베이스가 싫습니다 ... 현재 사용자가 엔티티를 좋아 하는 것으로 표시 (FB와 같이)하고 태그를 지정하고 주석을 달 수있는 웹 사이트를 만들고 있습니다 .
이 기능을 처리하기 위해 데이터베이스 테이블 디자인에 갇혀 있습니다. 한 가지 유형의 작업 (예 : 사진)에 대해서만이 작업을 수행 할 수 있으면 해결 방법은 간단합니다. 그러나 나는 이것을 5 가지 다른 것들에 대해 가능하게해야합니다 (현재는 서비스 전체가 커짐에 따라이 숫자가 커질 수 있다고 가정합니다).
비슷한 질문이 있지만 만족스러운 답변이 없으므로이 질문을 다시 묻습니다.
문제는 제대로하는 방법이며, 효율적으로 하고 탄성 이 다른에 대한 의견을 저장할 수 그래서, 데이터베이스를 설계 테이블 , 좋아하는 다른위한 테이블 및 태그 그들을 위해. 대답으로 일부 디자인 패턴이 가장 좋습니다.)
자세한 설명 : 나는이 테이블 User
일부 사용자 데이터, 3 개 테이블 : Photo
와 사진 , Articles
와 기사 , Places
와 장소 . 로깅 된 사용자가 다음을 수행 할 수있게하고 싶습니다.
이 세 가지 표 중 하나에 의견
그들 중 하나를 좋아하는 것으로 표시
태그를 사용하여 태그를 지정하십시오
또한 모든 요소에 대한 좋아요 수와 특정 태그가 사용 된 횟수를 세고 싶습니다.
1 차 접근법 :
A)를 들어 태그 , 나는 만듭니다 테이블을 Tag [TagId, tagName, tagCounter]
, 그때가 만들 대다 관계 테이블을 위해 : Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) 의견도 마찬가지입니다.
C) 나는 만듭니다 테이블을 LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. 수 좋아하는가 에 의해 계산됩니다 쿼리 (I 나쁜 가정). 과...
나는 마지막 부분에 대해이 디자인이 마음에 들지 않습니다. 나에게 나쁜 냄새가납니다.)
2 차 접근법 :
나는 테이블이 만들어집니다 ElementType [idType, TypeName == some table name]
의 이름 관리자 (나)에 의해 채워집니다 테이블 수 있습니다 좋아 , 주석 또는 태그를 . 그런 다음 테이블 을 만듭니다 .
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
각각에 대해 적절한 열이있는 주석 및 태그에 대해 동일합니다. 이제 사진을 좋아하게 만들려면 다음을 삽입하십시오.
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
그리고 장소 :
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
등등 ... 저는 두 번째 접근 방식이 더 낫다고 생각하지만,이 디자인에서도 뭔가 빠진 것 같은 느낌이 듭니다 ...
마지막으로, 나는 그 요소가 몇 번이나 좋아되었는지 카운터를 저장할 가장 좋은 곳이 무엇인지 궁금합니다. 두 가지 방법 만 생각할 수 있습니다.
- 요소 (
Photo/Article/Place
) 테이블 - count ()를 선택하십시오.
이 문제에 대한 나의 설명이 더 철저 해지기를 바랍니다.