정해진 스키마에 따라 데이터를 저장하여야 하므로 명확한 데이터 구조를 보장하고 있습니다.
또한 관계는 각 데이터를 중복없이 한 번만 저장할 수 있습니다.
테이블간테이블 간 관계를 맺고 있어 시스템이 커질 경우 JOIN문이 많은 복잡한 쿼리가 만들어질 수 있습니다.
성능 향상을 위해서는 서버의 성능을 향상 시켜야하는 Scale-up만을 지원합니다. 이로 인해 비용이 기하급수적으로 늘어날 수 있습니다.
스키마로 인해 데이터가 유연하지 못합니다. 나중에 스키마가 변경 될 경우 번거롭고 어렵습니다.
Oracle
- Oracle Corporation에서 개발되었으며 현재 가장 널리 사용되는 RDBMS이다.
- 사용자 정의 유형, 상속 및 다형성과 같은 객체 지향 기능을 구현하는 RDBMS를 객체 관계형 데이터베이스 관리 시스템(ORDBMS)이라고 한다.
- Oracle Database는 관계형 모델을 객체 관계형 모델로 확장하여 복잡한 비즈니스 모델을 관계형 데이터베이스에 저장할 수 있다.
- Oracel Database에서 데이터베이스 스키마는 논리 데이터 구조 또는 스키마 객체의 모음이다. 데이터베이스 사용자는 사용자 이름과 이름이 같은 데이터베이스 스키마를 소유한다.
- 스키마 객체는 데이터베이스에서 데이터를 직접 참조하는 사용자 생성 구조이다.
- 데이터베이스는 여러 유형의 스키마 객체를 지원하며 그 중 가장 중요한 것은 테이블과 인덱스이다.
MySQL
- MySQL은 오픈 소스이며 무료이고 세계에서 가장 인기있는 DB이다.
- MySQL의 주요 특징은 다음과 같다.
- MySQL은 관계형 데이터베이스이다.
- MySQL소프트웨어는 오픈소스이다.
- MySQL데이터베이스 서버는 매우 빠르고 안정적이며 확장 가능하며 사용하기 쉽다.
- MySQL서버는 클라이언트 / 서버 또는 임베디드 시스템에서 작동한다.
SQL Server
- Microsoft에서 개발한 SQL Server는 세계에서 가장 널리 사용되는 데이터베이스 중 하나이다.
- C, C++로 작성되어 있고 SQL Server는 Microsoft Azure Cloud의 일부이다.
PostgreSQL
- PostgreSQL은 복잡한 데이터 워크로드를 안전하게 저장하며 SQL 언어를 사용하고 확장하는 오픈 소스 객체 관계형 데이터베이스 시스템이다.
- PostgreSQL은 아키텍처, 안정서으 데이터 무결성, 강력한 기능 세트, 확장성 및 소프트웨어 뒤의 오픈소스 커뮤니티의 헌신으로 성능과 혁신적인 솔루션을 지속적으로 제공하는 것으로 유명하다.
IBM DB2
- IBM DB2는 transaction 및 warehousing workload에 고급 데이터 관리 및 분석 기능을 제공하는 관계형 데이터베이스이다.
- 고성능, 데이터 가용성 및 안전성을 제공하도록 설계되었으며 Linux, Unix 및 Windows 운영 체제에서 지원된다.
- DB2 데이터베이스 소프트웨어는 in-memory기술, 고급 관리 및 개발 도구, 스토리지 최적화, 워크로드 관리, 실행 가능한 압축 및 지속적인 데이터 가용성과 같은 고급 기능이 포함되어 있다.
- Ver11.5에서는 AI기능이 추가되어 데이터 과학 및 AI기술을 채택하여 경쟁 차별화를 가질 수 있다.
Microsoft Access
- 원격 또는 중앙 스토리지에서는 일반적으로 액세스가 사용되지 않는다.
- 로컬 소규모 데이터베이스에 사용된다.
SQLite
- SQLite는 작고 빠르며 독립적이다.
- 신뢰성이 높으며 완전한 기능을 갖춘 SQL 데이터베이스 엔진을 구현하는 C언어 라이브러리이다.
- SQLite는 모든 휴대폰과 대부분의 컴퓨터에 내장되어 있으며 사람들이 매일 사용하는 수많은 다른 응용 프로그램에 번들로 제공된다.
- SQLite 파일 형식은 안정적이고 크로스 플랫폼이다.
- 경우에 따라 SQLite가 direct filesysten I/O보다 빠르다.
- ANSI-C로 작성되었다.
- 크로스 플랫폼으로는 Android, *BSD, iOS, Linux, Mac, Solaris, VxWorks, Windows가 기본적으로 지원되며 다른 시스템으로 쉽게 포팅할 수 있다.
- SQLite를 관리하는데 사용할 수 있는 독립형 CLI클라이언트가 제공된다.
MariaDB
- MySQL개발자에 의해 만들어졌으며 오픈 소스를 유지하도록 보장했다.
- 주요 사용자로는 Wikipedia, WordPress.com, Google이 있다.
- MariaDB는 은행에서 웹 사이트에 이르기까지 광범위한 응용 프로그램에서 데이터를 구조화 된 정보로 변환한다.
- MySQL에서 조금의 변화를 가하여 성능을 향상시킬 수 있다.
- MariaDB는 스토리지 엔진, 플러그인 및 기타 여러 도구로 구성된 풍부한 에코 시스템으로 빠르게 확장 가능하며 강력하기 때문에 다양한 용도로 사용될 수 있다.
- MariaDB는 오픈 소스 소프트웨어 및 관계형 데이터베이스로 개발되어 데이터 액세스를 위한 SQL 인터페이스를 제공한다.
- 최신 MariaDB 버전에는 GIS(Geographic Information System)과 JSON(JavaScript Object Notation) 기능도 포함되어 있다.
Informix
- IBM Informix는 SQL, NoSQL/JSON, 시계열 및 공간 데이터를 완벽하게 통합 할 수있는 빠르고 유연한 데이터베이스이다.
- 설치 공간이 작고 자체 관리 기능이 있어 Informix는 임베디드 데이터 관리 솔루션에 적합하다.
- Informix의 주요 기능은 다음과 같다.
- Real-time analytics(실시간 분석)
- Fast, always-on transactions(빠른 상시 거래)
- Fewer data management hassless(데이터 관리 번거로움 감소)
- Simplicity(간단함)
Azure SQL
SELECT 속성명
FROM 릴레이션
[WHERE 조건]
[GROUP BY 속성명]
[HAVING 그룹조건]
[ORDER BY 속성 [ASC | DESC]];
INSERT INTO 릴레이션(속성명)
VALUES(데이터)
DELETE FROM 릴레이션
[WHERE 조건]; —WHERE이 생략되면 해당 릴레이션 내 모든 튜플 삭제
UPDATE 릴레이션
SET 속성명 =데이터
[WHERE 조건]; —WHERE절 생략되면 해당 릴레이션 내 모든 튜플 수정
GRANT 권한 ON 테이블 TO 사용자
[WITH GRANT OPTION]; —다른 사람과 권한을 나눠가질 수 있는 옵션
REVOKE 권한 ON 테이블 FROM 사용자
[CASCADE CONTRAINTS]; — 연쇄적인 권한 해제(WITH GRANT OPTION으로 부여된 것까지 취소)
후보키
릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별할 수 있는 속성들의 부분집합을 의미
모든 릴레이션은 반드시 하나 이상의 후보키를 가져야한다.
릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야한다.
ex) <학생> 릴레이션에서 '학번'이나 '주민번호'는 다른 레코드를 유일하게 구별할 수 있는 기본키로 사용할 수 있으므로 후보키가 될 수 있습니다. 즉
기본키가 될 수 있는 키들을 후보키라고 합니다.
기본키
후보키 중에서 선택한 주키(Main Key)
한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성
Null 값을 가질 수 없습니다. (개체 무결성의 첫번째 조건)
기본키로 정의된 속성에는 동일한 값이 중복되어 저장될 수 없습니다.(개체 무결성의 두번째 조건)
ex) <학생> 릴레이션에서 '학번'을 기본키로 정의되면 이미 입력된 학번은 다른 튜플의 '학번' 속성 값으로 입력할 수 없습니다.
대체키
후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키들을 말합니다.
보조키라고도 합니다.
ex) <학생> 릴레이션에서 '학번'을 기본키로 정의하면 '주민번호'는 대체키가 됩니다.
슈퍼키
슈퍼키는 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키로서 릴레이션을 구성하는 모든 튜플 중 슈퍼키로 구성된 속성의 집합과 동일한 값은 나타내지 않습니다.
릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족하지만, 최소성은 만족시키지 못합니다.
ex) <학생> 릴레이션에서는 '학번', '주민번호', '학번'+'주민번호', '학번'+'주민번호'+'성명' 등으로 슈퍼키를 구성할 수 있습니다. 또한 여기서 최소성을 만족시키지 못한다는 말은 '학번'+'주민번호'+'성명' 가 슈퍼기인 경우 3개의 속성 조합을 통해 다른 튜플과 구별이 가능하지만, '성명' 단독적으로 슈퍼키를 사용했을 때는 구별이 가능하지 않기 때문에 최소성을 만족시키지 못합니다. 즉 뭉쳤을 경우 유일성이 생기고, 흩어지면 몇몇 속성들은 독단적으로 유일성있는 키로 사용할 수 없습니다. 이것을 최소성을 만족하지 못한다고 합니다.
외래키
- 외래키는 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조 관계를 표현하는데 중요한 도구로 사용됩니다.
- 외래키로 지정되면 참조 테이블의 기본키에 없는 값은 입력할 수 없습니다. (참조 무결성 조건)
ex) <수강> 릴레이션이 <학생> 릴레이션을 참조하고 있으므로 <학생> 릴레이션의 '학번'은 기본키이고, <수강> 릴레이션의 '학번'은 외래키입니다.
즉 각 릴레이션의 입장에서 속성은 기본키가 되기도하고, 외래키가 되기도 합니다.
ex) <수강> 릴레이션의 '학번'에는 <학생> 릴레이션의 '학번'에 없는 값은 입력할 수 없습니다.
- *** NULL 값 ???? ****
- **> 데이터베이스에서 아직 알려지지 않았거나, 모르는 값으로서 "해당 없음" 등의 이유로 정보 부재를 나타내기 위해 사용하는, 이론적으로 아무것도 없는 특수한 데이터를 뜻합니다.**
<키 포함관계>
1:1 관계
란 어느 엔티티 쪽에서 상대 엔티티와 반드시 단 하나의 관계를 가지는 것을 말한다. 예를 들어, 우리나라에서 결혼 제도는 일부일처제로, 한 남자는 한 여자와, 한 여자는 한 남자와 밖에 결혼을 할 수 없다. 남편 또는 부인을 2명 이상 둘 수 없는데, 이러한 관계가 1:1 관계
다. 1:N 관계
는 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미한다. 현실세계에는 1:N관계가 많이 있는데, 실제 DB를 설계할 때 자주 쓰이는 방식이다. 1:N 관계는 N:M 관계처럼 새로운 테이블을 만들지 않는다. 예를 들어, 부모와 자식 관계를 생각해보면, 부모는 자식을 1명, 2명, 3명, 그 이상도 가질 수 있다.이를 부모가 자식을 소유한다고(has a 관계) 표현한다. 반대로 자식 입장에서는 부모(아버지, 어머니의 쌍)를 하나만 가질 수 밖에 없다. 이러한 관계를 1:N 관계
라고 하며, 계층적인 구조로 이해할 수도 있다. 여러 명의 자식(N)의 입장에서 한 쌍의 부모(1)중 어떤 부모에 속해 있는지 표현해야하므로 부모 테이블의 PK
를 자식 테이블에 FK
로 집어 넣어 관계를 표현한다. *PK(Primary Key)
: 각 엔티티를 식별할 수 있는 대표키, 테이블에서 중복되지 않는(Unique) 값, Null일 수 없다.* *FK(Foreign Key
: 다른 테이블의 기본키를 참조, 모든 필드는 참조하는 기본키와 동일한 도메인(값의 종류&범위)을 갖는다.모든 필드 값은 참조하는 기본키와 동일하거나 null 일 수 있다.* 즉 부모 테이블(1)에서는 내 자식들이 누구인지 정보를 넣을 필요가 없고, 자식 테이블(N)에서만 각각의 자식들이 자신의 부모 정보(FK)를 넣음 으로써 관계를 표현할 수 있다.N:M 관계
는 관계를 가진 양쪽 엔티티 모두에서 1:N 관계
를 가지는 것을 말한다. 즉, 서로가 서로를 1:N 관계
로 보고 있는 것이다. 예를들어, 학원과 학생의 관계를 생각해보면, 한 학원에는 여러명의 학생이 수강할 수 있으므로 1:N 관계
를 가진다. 반대로 학생도 여러개의 학원을 수강할 수 있으므로, 이 사이에서도 1:M 관계
를 가진다. 그러므로 학원과 학생은 N:M 관계
를 가진다고 할 수 있다. N:M 관계
는 서로가 서로를 1:N 관계
, 1:M 관계
로 갖고 있기 때문에, 서로의 PK
를 자신의 외래키 컬럼으로 갖고 있으면 된다. 일반적으로 N:M 관계
는 두 테이블의 대표키를 컬럼으로 갖는 또 다른 테이블을 생성해서 관리한다.SELECT COUNT(customerID) FROM customers;
SELECT (customerID) FROM customers;
SELECT sum(UnitPrice) FROM products;
SELECT MAX(UnitPrice) FROM products;
SELECT MIN(UnitPrice) FROM products;
SELECT CEILING(sum(UnitPrice)) FROM products;
SELECT LEFT(CompanyName, 5) FROM customers LIMIT 5;
SELECT RIGHT(CompanyName, 5) FROM customers LIMIT 5;
SELECT UPPER(CompanyName) FROM customers LIMIT 5;
SELECT LOWER(CompanyName) FROM customers LIMIT 5;
SELECT CONCAT(LOWER(CompanyName), UPPER(CompanyName)) FROM
customers LIMIT 5;
SELECT distinct(country) FROM customers;
SELECT companyName, ISNULL(country) FROM customers;
기능적 Built-in Functions
WHERE FIELD IS NOT NULL;
SELECT Apply함수(`column`)
FROM `테이블의 목록`
GROUP BY `묶을 Field`
SELECT Apply함수(`column`)
FROM `테이블의 목록`
GROUP BY `묶을 Field1, Field2`
HAVING `조건절`
SELECT supplierID, SUM(UnitPrice)
FROM products
GROUP BY supplierID LIMIT 5;
변경후:SELECT supplierID, SUM(UnitPrice) as unitprice
FROM products
GROUP BY supplierID LIMIT 5;
SELECT `column 목록`
FROM `테이블의 목록`
INNER JOIN `조인 테이블`
ON `기준 Column`
SELECT A.column_a, B.column_b
FROM TABLE_A as A
INNER JOIN TABLE_B as B
ON A.key_column = B.forginkey_column
SELECT A.column_a, B.column_b
FROM TABLE_A as A, TABLE_B as B
WHERE A.key_column = B.forginkey_column
이렇게 INNER JOIN문을 where 조건절로도 Query 가능SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
SELECT column_name
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
유저,팔로우/팔로잉, 게시글(게시물), 좋아요, 댓글, DM
유저가 다른 유저를 팔로잉한다.
다른 유저가 나를 팔로우한다.
유저가 다른 유저의 게시물에 좋아요를 누른다. 댓글을 단다.
다른유저가 나의 게시물에 좋아요를 누른다. 댓글을 단다.
유저가 다른 유저와 DM을 주고 받는다.
하나의 게시글에는 여러 개의 게시물이 들어갈 수 있다.
게시글에 태그를 한다(사람언급 및 ‘#’ 다 가능)
한 유저가 게시글에 답글을 단다.
유저가 스토리를 게시한다.
유저가 다른 유저를 검색한다.
user-user_id,이메일(VARCHAR), 아이디(VARCHAR), 비밀번호(VARCHAR), nickname, profile_image_URl TEXT, intro TEXT ,status,createAt,updateAt, name
post- post_id, caption(text), user_id, status,createAt,updateAt
story- story_id, story_caption(text), ,user_id, , status,createAt,updateAt
media- media_id, file_data VARCHAR, status,createAt,updateAt
media_video_view- media_video_view, media_id, view
tag-tagid, caption(text),media_id
reply- replyid, userid, postid, status,createAt,updateAt, content TEXT
likes- liekID, user_ID, post_ID, createAt, Like_status
following- following_ID, from_user, to_user
follower- follower_ID, to_user, from_user
Room-Room_id, sender(user_id), receiver(user_id), message_id, status,createAt,updateAt
message- message_id, content TEXT, status,createAt,updateAt
Searching- searching_id, user_id, createAt
<추가>
Post_media – Post_media_id, post_id, media_id
story에 media_id 추가
한 user가 여러 개의 POST 올리는 것이 가능 1:N
한 post는 여러 개의 MEDIA를 가짐 (1:N or N:M ,여기서는 한 POST에 올린 MEDIA를 다른 POST에 올리지 않는다고 가정하여 1:N으로 가정한다)
한 유저가 여러 개의 댓글을 달 수 있다. 1:N
댓글을 지우면 댓글과 관련된 정보들이 사라지므로 user와 연결테이블을 만들필요없음
마찬가지로 post도 사라지면 post에 연결된 media들도 안보여지기 때문에 연결테이블을 만들필요없음
한 유저가 올린 게시물은 다른 유저와 겹칠일이 없고 태그로 관리되기 때문에 N:M 링킹테이블을 만들어줄 필요가 없다.
인스타 스토리 or 게시글에 올리는건 media다. 태그는 media에 달리는 것
post와 media를 Linking 하는 테이블을 따로 생성 -> 한 포스트에 여러 개의 미디어가 있을 수 있기 때문에( 업데이트에 용이)
출처:
데이터베이스 용어 정리 - 필드, 레코드, 엔티티, 특성
[데이터베이스]릴레이션 키 개념& 종류(기본키, 슈퍼키, 대체키, 복합키, 후보키)&특징, 유일성 최소성이란?