내 운동화를 추적할 데이터베이스를 설계하다

21607 단어
표지 사진 - Undraw 디자인 데이터
이것은 본과 컴퓨터 과학 프로젝트입니다. 저는 제 동창과 함께 일할 기회가 있습니다. Garry (@garrygrewal)

앞말


본고는 프로젝트 예시를 통해 ER 모델링이 SQL 데이터베이스에서의 응용을 깊이 있게 이해하고자 한다.비록 나는 모든 기술 용어의 링크를 포함하려고 시도했지만, 이것은 전면적인 ER 모델링 초보자 안내서가 아니다.그러나, 나는 확실히 ER 모델링 가이드를 발표할 계획이다. 따라서 나의 설명이 ER 모델을 더욱 잘 이해하는 데 도움이 된다면 댓글이나 DM을 통해 알려 주십시오.

HypeTracker란 무엇입니까?


What is this "hype" and how do I get more of it?


HypeTracker는 소셜 미디어 플랫폼(예를 들어 Reddit와 트위터)에서 데이터를 수집하여 사람들이 한동안 운동화를 언급한 횟수를 나타낸다.이러한 데이터는 매우 가치가 있다. 왜냐하면 판매 후 시장의 운동화 가격이 어느 시점에 상술한 운동화의 관심이나'노이즈'의 영향을 받을 수 있기 때문이다.이러한 데이터를 수집하고 도형으로 표시함으로써 사용자는 소셜 미디어를 통해 이를 상품의 가격 역사와 비교하고 감지 가치에 따라 어떤 운동화를 구매할지 현명한 결정을 내릴 수 있다.

ER 모델링을 사용하여 데이터베이스 설계


이 프로젝트는 주로 데이터 중심이기 때문에 잘못된 데이터 관계나 중복 항목 등 문제가 발생하지 않도록 데이터를 저장하고 접근하는 방법을 설계하고자 합니다.설명된 오류가 데이터베이스를 삭제하고 처음부터 시작하게 할 수도 있습니다. 이것은 프로젝트의 진도에 따라 우울할 수도 있습니다.

엔티티 및 속성


Can I re-roll for more strength?


HypeTracker에서 SQL에서 데이터 모델을 실현하기 전에 데이터 모델을 시각적으로 설명하는 방법entity relationship (ER) modeling을 사용합니다.우리는 먼저 가장 중요한 entities (실제 세계의 대상) 을 열거했다.
  • 운동화 - 이 응용 프로그램의 테마 초점
  • 구성원 - 어플리케이션 사용자
  • 순위 - 스니커즈 언급/등장 내역 저장
  • 다음에 우리는 우리가 모든 실체를 위해 고려한 일부 속성(특징이나 정보)을 썼다.
    운동화
    구성원
    서열
    이름
    이름
    플랫폼
    브랜드
    전자 우편
    언급하다
    가격 *
    은어
    날짜
    *** 게시된 소매 가격(비가격 내역)
    이것은 우리가 처음 생각한 프로젝트 집합일 뿐, 나중에 더 많은 속성을 추가했다는 것을 기억하세요.그러나 이 도표는 우리의 응용 프로그램에 필요한 가장 중요한 속성에 기반을 제공하고 우리의 데이터 모델이 복잡해질 때 간단한 보기를 제공한다.

    실체 간의 관계


    What are we?


    다음 단계에서 우리는 실체가 어떻게 상호작용하는 간단한 장면을 통해 실체 간의 관계를 정의하기 시작한다.

    운동화와 회원

  • 운동화 한 짝당 한 명 이상의 구성원
  • 이 모니터링 가능
  • 각 구성원은 하나 이상의 운동화를 감시할 수 있다
  • 운동화와 순위

  • 운동화 한 켤레당 0개 또는 여러 개 순위
  • 랭킹당 운동화 1개만 포함
  • *** 구성원과 서열 엔티티는 상관 없음
    실체 관계는 그cardinality를 통해 모델링할 수 있는데 이것은 그 관계에 디지털 표현을 추가했다.예를 들어 운동화와 회원 사이에는 여러 쌍의 관계가 존재한다. 왜냐하면 한 운동화는 여러 회원이 볼 수 있고 한 회원은 여러 개의 운동화를 볼 수 있기 때문이다.이 동시에 운동화와 순위는 한 쌍의 관계가 있다. 왜냐하면 한 개의 운동화는 0개 또는 여러 개의 관련 순위가 있을 수 있지만 각 순위는 한 개의 운동화만 묘사할 수 있기 때문이다.
    Crow's foot notation를 기수로 사용하여 이 모든 것을 기호로 변환합니다. 이것이 바로 우리의 ER 그림이 이 점에 있는 모습입니다.

    중요한 솔리드와 관계식이 있는 초기 ER 그림

    비솔리드 세트


    Apes strong together


    이때 확인해야 할 관건 중 하나는 적어도 운동화 실체가 없으면 순위 실체가 존재하지 않는다는 것이다.이것은 서로 다른 유형의 관계를 창조했는데 그 중에서 weak entity(순위)는 더욱 강한 실체(운동화)에 의존한다.우리는 관계를 쌍마름모꼴로 바꾸고 약한 실체를 쌍사각형으로 바꾸며 약한 실체와 약한 관계 사이에 두 개의 선을 사용하여 이 점을 나타낼 수 있다.

    비솔리드 세트 수정된 ER 그림

    다대다 관계


    There's not enough room for all of us in this relationship


    불행하게도 우리는 아직 이 데이터 모델을 완성하지 못했다.또 다른 두드러진 문제는 운동화와 회원 실체 간의 기수 문제다.여러 쌍의 다중 관계가 SQL에 문제가 생겼습니다. 예를 들어 한 구성원이 데이터베이스에 어떻게 여러 개의 운동화를 동시에 저장합니까?또한 in this article 의 기타 질문과 제안된 해결 방안을 읽을 수 있지만 associative entity 를 사용하십시오.
    관련 실체를 사용하면 우리는 운동화와 구성원 간의 관계를 새로운 관찰 목록 실체로 재구성할 수 있다. 이 실체는 구성원과 운동화를 추적한다.

    연관 엔티티 수정된 ER 그림

    완료 중


    That was easy


    이제 우리는 기본적으로 완성했다!foreign key(s)를 속성으로 추가하고 primary key(s) 아래에 밑줄을 긋기만 하면 생성된 ER 그림입니다.

    ER 그림 완성!
    다음은 MariaDB(v10.1.35)에서 이 기능을 수행하는 SQL 파일입니다.
    /* hypetracker.sql */
    
    CREATE DATABASE IF NOT EXISTS HypeTracker;
    
    USE HypeTracker;
    
    CREATE TABLE IF NOT EXISTS `Sneakers` (
      `Name` VARCHAR(100) NOT NULL,
      `Price` DECIMAL(9,2) UNSIGNED,
      `Brand` VARCHAR(40) NOT NULL,
      CONSTRAINT `PK_Sneakers` PRIMARY KEY (Name)
    ) ENGINE=InnoDB;
    
    CREATE TABLE IF NOT EXISTS `Members` (
      `Name` VARCHAR(40) NOT NULL,
      `Email` VARCHAR(100) NOT NULL,
      `Password` VARCHAR(40) NOT NULL,
      CONSTRAINT `PK_Members` PRIMARY KEY (Email)
    ) ENGINE=InnoDB;
    
    CREATE TABLE IF NOT EXISTS `Watchlist` (
      `SneakerName` VARCHAR(100) NOT NULL,
      `MemberEmail` VARCHAR(100) NOT NULL,
      CONSTRAINT `PK_Watchlist` 
        PRIMARY KEY (SneakerName, MemberEmail),
      CONSTRAINT `FK_Watchlist_Sneakers`
        FOREIGN KEY (SneakerName) 
        REFERENCES Sneakers(Name)
        ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `FK_Watchlist_Members`
        FOREIGN KEY (MemberEmail) 
        REFERENCES Members(Email)
        ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB;
    
    CREATE TABLE IF NOT EXISTS `Rankings` (
      `Platform` VARCHAR(100) NOT NULL,
      `Date` DATE NOT NULL,
      `SneakerName` VARCHAR(100) NOT NULL,
      `Mentions` INT UNSIGNED NOT NULL,
      CONSTRAINT `PK_Rankings`
        PRIMARY KEY (Platform, Date, SneakerName),
      CONSTRAINT `FK_Rankings_Sneakers`
        FOREIGN KEY (SneakerName)
        REFERENCES Sneakers(Name)
        ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB;
    
    
    다음은 특정 장면의 데이터를 검색하는 데 사용되는 SQL 질의의 예입니다.
    
    /* Get All Sneakers Watched by a Member */
    SELECT S.Name, S.Price, S.Brand
    FROM Sneakers S
    INNER JOIN Watchlist W
    ON S.Name = W.SneakerName
    WHERE W.MemberEmail = '$email'; /* $email is a PHP variable here */
    
    /* Get the 5 Most Mentioned Sneakers In the Last Week */
    SELECT S.Name, S.Price, S.Brand, RS.TotalMentions
    FROM Sneakers S
    INNER JOIN
    (
      SELECT R.SneakerName, SUM(Mentions) AS TotalMentions
      FROM Rankings R
      WHERE R.Date > DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
      GROUP BY R.SneakerName
      ORDER BY TotalMentions DESC
      LIMIT 5
    ) RS
    ON S.Name = RS.SneakerName;
    
    

    수확과 학습


    It's not over yet!


    위에서 말한 바와 같이 우리는 실체 관계 모델을 사용하여 우리의 수요에 따라 관계 데이터베이스를 설계하여 실현하기 전에 우리의 데이터베이스를 가시화시켰다.나는 데이터 관계를 기수를 통해 표현하는 방법과 다대다 관계를 어떻게 재구성하여 SQL에서 잘 작동하도록 하는지 배웠다.ER 그림을 만드는 것은 매우 번거롭지만, 이것은 우리의 디자인 결정을 검증하는 중요한 과정으로 이후에 간단한 의존이나 불필요한 문제가 발생하지 않도록 한다.저는 SQL에 대한 지식을 더 많이 배우고 있습니다. 이 글은 이 프로젝트가 PHP에서 실현된 후의 교체를 상세하게 소개합니다.

    데이터 규범화


    즉, 우리가 필요로 하는 실체 수량이 비교적 적기 때문에 우리는 상대적으로 간단한 모델을 사용하고 있고 더 많은 필요로 하는 문제에 부딪히지 않았다normalization techniques.나는 문장에서 이 용어를 사용하는 것을 피했다. 왜냐하면 그 자체가 복잡한 주제이기 때문에 우리는 재구성 절차를 통해 Boyce-Codd Normal Form (BCNF)에서 데이터 모델을 실현할 수 있다.데이터베이스에 대한 자세한 내용을 보려면 different normal forms and normalization techniquesrelational algebrarelational calculus 를 참조하여 SQL 질의를 보다 효과적으로 표현하는 것이 좋습니다.

    회사 명 / 스토커


    공용 API(Twitter, Reddit)에서 데이터를 읽고 시각화된 전체 스택 웹 응용 프로그램 만들기








    HypeTracker는 판매 후 시장에서 거래되는 운동화에 대한 소셜 미디어의'인상'에 사용되는 데이터 집합 응용 프로그램이다.
    내 블로그 세부 정보 보기what HypeTracker iswhy I am refactoring it

    V2의 변경 로그/대상


  • 데이터베이스 아키텍처 마이그레이션은 PR#4 참조

  • 내부 운동화 마이그레이션 API 참조 PR#7

  • 마이그레이션 프런트엔드는 PR#17 참조
  • 프레젠테이션/푸시용 v2
  • 배포
  • 소셜미디어api 캡처 추가
  • 입문


    요구 사항


    가택

  • PHP^7.3
  • 작곡가^1.10.13
  • Vagrant^2.10(가상화 레이어 선택 가능)
  • (예시) VirtualBox^6.1.14(Vagrant의 VirtualBox 공급업체)
  • $git 클론https://github.com/justinhodev/hype-tracker.git
    $cd 스토커
    # Composer 종속성 설치
    $composer 설치
    # 택지 배치 준비
    $composer 택지
    # VM 구성
    $vagrant 상향
    #송승헌 방랑자 상자 입장
    $vagrant ssh

    부두 노동자


    곧 올 것이다

    데이터베이스 실체 관계 모델



    라이센스



    View on GitHub

    토론


    이 글이 당신에게 도움이 되었는지, 아니면 다음 댓글에서 SQL에 대한 더 많은 지식을 배울 계획인지 알려 주세요!

    좋은 웹페이지 즐겨찾기