테이블간 관계 질문드립니다

미해결질문
MINSEON KIM 프로필

1. sql에서는 foreign key랑 reference관계만 설정해주면 1:n  관계인지 1:1관계인지 n:n관계인지는 자동으로 설정이 되는것인가요?

2. 데이터 무결성 제약조건에는 데이터 수정과 데이터 삭제에 관한 제약도 존재하는데

만약 메인테이블의 키값을 삭제하면 해당 키값을 가지고있는 연결된 하위테이블의 레코드까지 삭제되도록 하거나,

참조되는 메인 테이블에서의 키값을 변경하면 하위테이블의 값들까지 자동으로 변경되도록 설정하는 방법은 따로 있을까요?

3. 크롤링 예제 설명도중에 링크를 가져오실때 어떤 태그의 href값은 product_link.attrs['href'] 이렇게 가지고 오고, 어떤 태그의 경우는 category['href']와 같이 attrs를 쓰지 않고 가져왔는데 이차는 무엇일까요???

답변 미리 감사드립니다. 

잔재미코딩 프로필
잔재미코딩 3달 전

안녕하세요.

본 강좌에서 설명드린 부분은 무결성을 위해 foreign key를 사용한 부분인데요

1:n, n:m 관계를 만들어주려면, 추가적인 CONSTRAINT 문법을 사용해야 합니다. MySQL 문법도 굉장히 많긴 해서요. 기본적으로는 그렇게 많이 쓰는 문법은 아니예요

근데 설명이 좀 많이 복잡해요 일단 간략히만 말씀드리면, 다음과 같은 문법을 쓰면 1:n 관계를 만들수 있습니다.

CONSTRAINT 제약이름 foreign key (primary key 가 아닌 필드명) references 다른테이블(해당 테이블의 primary key 인 필드명) 

이 부분은 실제 테이블과 같이 봐야하는데요.다음과 같이 쓸 수 있어요

create table store(
    id int unsigned not null auto_increment,
    store_name varchar(30) not null,
    primary key(id)
);

Query OK, 0 rows affected (0.02 sec)

create table product(
    id int unsigned not null auto_increment,
    store_id int unsigned not null,
    product_name varchar(30) not null,
    price float not null,
    primary key(id),
    constraint product_store foreign key (store_id) references store(id)
);

다음으로는 n:m 관계는 더 복잡하긴 한데요
다음과 같이 각 테이블에 primary key 가 아닌 필드를 각각 다른 테이블의 primary key 와 foreign key를 맺어놓고, 이 두 foreign key를 쌍으로 하는 제약조건을 만들면,
n:m 관계를 만들 수가 있습니다.

create table store(
    id int unsigned not null auto_increment,
    store_name varchar(30) not null,
    primary key(id)
);

Query OK, 0 rows affected (0.04 sec)

create table product(
    id int unsigned not null auto_increment,
    store_id int unsigned not null,
    product_name varchar(30) not null,
    price float not null,
    primary key(id)
);

Query OK, 0 rows affected (0.01 sec)

create table product_store (
    product_id int unsigned not null,
    store_id int unsigned not null,
    CONSTRAINT product_store_store foreign key (store_id) references store(id),
    CONSTRAINT product_store_product foreign key (product_id) references product(id),
    CONSTRAINT product_store_unique UNIQUE (product_id, store_id)
)

이 예제는 다음 링크를 통해, 관련 예제를 찾아보았어요.

https://stackoverflow.com/questions/43990459/how-to-create-tables-with-nm-relationship-in-mysql

2 번도 추가 문법이 존재합니다. ON DELETE CASCADE 라는 문법을 붙여주면 되는데요. 이 부분도일반적으로 많이 쓰는 문법은 아니예요. 추가 설명은 다음 관련 링크를 참조하시면 좋을 것 같습니다.

foreign key(parent) references personinfo(person) on delete cascade

https://m.blog.naver.com/PostView.nhn?blogId=pjt3591oo&logNo=220617636202&proxyReferer=https:%2F%2Fwww.google.com%2F

3. 둘다 동일합니다. 프로그래밍이나 SQL 모두 다양한 문법이 존재하고요. 동일한 기능을 이렇게 써도 되고, 다르게 써도 되는 경우가 은근히 엄청 많습니다. 그래서 헷깔리기도 하는데요. 저같은 경우는 그 중에 편한 것을 그냥 쓰는데, 예제코드는 만들다보니 두 케이스를 다 보여드렸네요.

조금 기본 문법은 아니다보니 댓글로는 한계가 있어서 일부 미진한 부분은 관련링크를 붙였어요. 참고하시면 좋을것 같습니다. 다만 많이 쓰이는 문법은 아니라서요. 참고만 가볍게 하시면 더 좋을것 같습니다.

감사합니다.

MINSEON KIM 프로필
MINSEON KIM 3달 전

감사합니다. 선생님.😊

지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스