RDB / NoSQL
관계형 모델을 사용하여 데이터를 저장하고 관리하는 특정 유형의 데이터베이스 관리 시스템(DBMS)
데이터는 테이블로 구성되며 관계를 통해 서로 연결됩니다.
데이터 조작 및 쿼리에 SQL을 사용
ACID 규정 준수: RDBMS는 일반적으로 안정적인 트랜잭션 처리를 위해 ACID(원자성, 일관성, 격리성, 내구성) 속성을 보장합니다
모든 RDBMS는 데이터베이스이지만 모든 데이터베이스가 RDBMS는 아닙니다.
RDBMS
데이터가 구성되는 방식과 데이터 간의 관계를 정의한다.
RDB에서 스키마는 데이터베이스 내의 데이터 구성을 지시하는 프레임워크 역할을 합니다.
스키마는 디자인을 실제로 구현한 것. 상세 아키텍쳐 계획.
ERD는 이러한 스키마를 지도처럼 시각화해서 표현한것!
DBMS에서 데이터를 관리하고 조작하기 위해 특별히 고안된 표준 프로그래밍 언어
관계형 데이터베이스에 저장된 데이터에 대해 다양한 작업을 수행하는 데 사용!
RDB 와 연결해 사용자 및 애플리케이션 과 데이터베이스 중간에서 상호작용한다.
NoSQL
그러나 시간이 지나면서 "NoSQL"에 대한 해석은 "Not only SQL"이라는 의미로 발전
이는 NoSQL 데이터베이스가 SQL 기반 시스템의 '대안'으로 개발되었지만 반드시 이를 완전히 대체할 의도는 아니라는 점을 인정하기때문!
=> 점점 NoSQL 데이터베이스는 다양한 데이터 모델(예: 키-값, 문서, 열 계열, 그래프)을 제공하며
Ex) 전체 데이터베이스 구조를 수정하지 않고도 데이터 형식을 쉽게 변경가능
ACID, Transaction 등을 지원하지 않는다.(아닌경우도 있다! ex 몽고Db)
NoSQL 데이터베이스를 사용하면 유연하고 동적 스키마로 작업할 수 있습니다
구조를 미리 정의할 필요 없이 데이터를 저장하고 검색할 수 있습니다.
각 문서는 서로 다른 구조를 가질 수 있지만 일반적으로 JSON형식
각 '문서'는 고유한 구조를 가질 수 있습니다. 예를 들어, 한 문서에는 동일한 컬렉션(RDBMS의 테이블과 유사)에 있는 다른 문서와 완전히 다른 데이터 필드가 포함될 수 있습니다.
import redis
redis_client.lpush('fruits', 'apple')
redis_client.lpush('fruits', 'banana')
# 키-값 쌍의 모음인 해시를 사용 (파이썬 딕셔너리 느낌)
redis_client.hset('user:1000', 'name', 'Alice')
redis_client.hset('user:1000', 'age', 30)
대용량 데이터를 관리하기 위해서 설계된 시스템.
구조가 정의되어있긴 하지만, 기존 SQL 데이터베이스보다 더 유연
데이터는 계열로 그룹화된 열에 저장됩니다. 열은 행마다 다를 수 있습니다.
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.CqlSessionBuilder;
import com.datastax.oss.driver.api.core.cql.ResultSet;
import com.datastax.oss.driver.api.core.cql.Row;
public class CassandraExample {
public static void main(String[] args) {
// Create a session with Cassandra
try (CqlSession session = new CqlSessionBuilder().build()) {
// Create a keyspace
String createKeyspace = "CREATE KEYSPACE IF NOT EXISTS mykeyspace WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};";
session.execute(createKeyspace);
// Create a table
String createTable = "CREATE TABLE IF NOT EXISTS mykeyspace.users (id UUID PRIMARY KEY, name text, email text);";
session.execute(createTable);
// Insert data into the table
String insertData = "INSERT INTO mykeyspace.users (id, name, email) VALUES (uuid(), 'John Doe', 'john.doe@example.com');";
session.execute(insertData);
// Retrieve data from the table
ResultSet resultSet = session.execute("SELECT * FROM mykeyspace.users;");
for (Row row : resultSet) {
System.out.println("User: " + row.getUuid("id") + ", " + row.getString("name") + ", " + row.getString("email"));
}
}
}
}
노드, 에지, 속성이 있는 그래프 구조를 사용하여 데이터를 표현하고 저장
관계형 스키마에 비해 더 유동적!
데이터베이스는 다양한 데이터 모델(예: 키-값, 문서, 열 패밀리, 그래프)을 제공하며 일반적으로 보다 유연한 스키마를 허용
import org.neo4j.driver.AuthTokens;
try (Session session = driver.session()) {
// Write transactions
String createQuery = "CREATE (a:Person {name: 'Alice', age: 22})-[:KNOWS]->(b:Person {name: 'Bob', age: 25})";
try (Transaction tx = session.beginTransaction()) {
tx.run(createQuery);
tx.commit();
}
// Read transactions
String readQuery = "MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name";
try (Transaction tx = session.beginTransaction()) {
Result result = tx.run(readQuery);
while (result.hasNext()) {
var record = result.next();
System.out.println(record.get("a.name").asString() + " knows " + record.get("b.name").asString());
}
tx.commit();
}
}
}
SQL(구조적 쿼리 언어)을 사용하지 않습니다.
동적이며 종종 스키마가 없는 데이터 모델을 통해 더 많은 유연성을 제공!
특정 데이터 모델에 맞는 다양한 쿼리 언어를 제공
NoSQL이 유리한 경우, 불리한 경우는 언제일까?
=> 다양한 데이터 유형을 처리하거나 빠르게 진화하는 데이터 모델을 다루는 애플리케이션에 적합!
=> 이는 대규모 애플리케이션과 빅 데이터 요구에 이상적!
=> 특정 작업, 특히 대량의 데이터를 처리하거나 단순한 읽기/쓰기 작업을 처리할 때 유리!
=> 애플리케이션의 특정 요구사항에 맞는 더 많은 선택지를 제공!
=> 이로 인해 학습이 어렵고, 상호 운용성에 문제가 생길 수 있습니다.
=> 데이터 일관성이 중요한 애플리케이션에는 적합하지 않을 수 있습니다.
정리
RDBMS를 사용해야 할 때
https://db-engines.com/en/ranking