@kiyeonjeon21/datacontext 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +13 -0
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +115 -0
- package/dist/api/server.js.map +1 -1
- package/dist/cli/index.js +58 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/core/context-service.d.ts +63 -0
- package/dist/core/context-service.d.ts.map +1 -1
- package/dist/core/context-service.js +66 -0
- package/dist/core/context-service.js.map +1 -1
- package/dist/core/harvester.d.ts +57 -5
- package/dist/core/harvester.d.ts.map +1 -1
- package/dist/core/harvester.js +86 -6
- package/dist/core/harvester.js.map +1 -1
- package/dist/core/types.d.ts +21 -5
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge/store.d.ts +186 -3
- package/dist/knowledge/store.d.ts.map +1 -1
- package/dist/knowledge/store.js +389 -5
- package/dist/knowledge/store.js.map +1 -1
- package/dist/knowledge/types.d.ts +252 -4
- package/dist/knowledge/types.d.ts.map +1 -1
- package/dist/knowledge/types.js +138 -1
- package/dist/knowledge/types.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +231 -3
- package/dist/mcp/tools.js.map +1 -1
- package/docs/KNOWLEDGE_GRAPH.md +540 -0
- package/docs/KNOWLEDGE_TYPES.md +261 -0
- package/docs/MULTI_DB_ARCHITECTURE.md +319 -0
- package/package.json +1 -1
- package/scripts/create-sqlite-testdb.sh +75 -0
- package/scripts/test-databases.sh +324 -0
- package/sqlite:./test-sqlite.db +0 -0
- package/src/adapters/sqlite.ts +16 -0
- package/src/api/server.ts +134 -0
- package/src/cli/index.ts +57 -16
- package/src/core/context-service.ts +70 -0
- package/src/core/harvester.ts +120 -8
- package/src/core/types.ts +21 -5
- package/src/index.ts +19 -1
- package/src/knowledge/store.ts +480 -6
- package/src/knowledge/types.ts +321 -4
- package/src/mcp/tools.ts +273 -3
- package/test-sqlite.db +0 -0
- package/tests/knowledge-store.test.ts +130 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Knowledge Types Guide
|
|
2
|
+
|
|
3
|
+
> DataContext의 지식 유형 정리 및 사용 가이드
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
DataContext는 4가지 유형의 지식을 관리합니다:
|
|
8
|
+
|
|
9
|
+
| 유형 | 목적 | 자동 적용 | AI 참조 |
|
|
10
|
+
|------|------|:--------:|:-------:|
|
|
11
|
+
| **Table Description** | 테이블/컬럼 설명 | ❌ | ✅ |
|
|
12
|
+
| **Business Glossary** | 용어 → SQL 번역 | ❌ | ✅ |
|
|
13
|
+
| **Business Rule** | 자동 적용 필터 | ✅ | ✅ |
|
|
14
|
+
| **Query Example** | 검증된 SQL 패턴 | ❌ | ✅ |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Table Description (테이블 설명)
|
|
19
|
+
|
|
20
|
+
**목적:** 테이블과 컬럼의 비즈니스 의미 설명
|
|
21
|
+
|
|
22
|
+
**사용 시점:** AI가 스키마를 이해할 때
|
|
23
|
+
|
|
24
|
+
**예시:**
|
|
25
|
+
```yaml
|
|
26
|
+
table: users
|
|
27
|
+
description: "고객 계정 정보를 저장하는 테이블"
|
|
28
|
+
columns:
|
|
29
|
+
- name: status
|
|
30
|
+
description: "계정 상태 (0=비활성, 1=활성, 2=정지)"
|
|
31
|
+
- name: created_at
|
|
32
|
+
description: "계정 생성 일시"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**관리 방법:**
|
|
36
|
+
- `datacontext harvest` - DB 코멘트에서 자동 수집
|
|
37
|
+
- `datacontext describe` - 수동 추가/수정
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. Business Glossary (용어 사전) ⭐
|
|
42
|
+
|
|
43
|
+
**목적:** 도메인 용어를 SQL 조건으로 번역
|
|
44
|
+
|
|
45
|
+
**사용 시점:** AI가 자연어 쿼리를 SQL로 변환할 때
|
|
46
|
+
|
|
47
|
+
**핵심 특징:**
|
|
48
|
+
- **선택적 적용** - AI가 컨텍스트에 맞게 판단
|
|
49
|
+
- **번역 도우미** - "활성 사용자"라고 하면 AI가 `status = 1` 사용
|
|
50
|
+
- **동의어 지원** - "active user", "활성화된 사용자" 모두 같은 의미
|
|
51
|
+
|
|
52
|
+
**예시:**
|
|
53
|
+
```yaml
|
|
54
|
+
term: "활성 사용자"
|
|
55
|
+
synonyms: ["active user", "활성화된 사용자"]
|
|
56
|
+
definition: "status 컬럼이 1인 사용자"
|
|
57
|
+
sqlExpression: "status = 1"
|
|
58
|
+
appliesTo:
|
|
59
|
+
tables: ["users"]
|
|
60
|
+
category: status
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**사용 시나리오:**
|
|
64
|
+
```
|
|
65
|
+
사용자: "활성 사용자 목록 보여줘"
|
|
66
|
+
AI: SELECT * FROM users WHERE status = 1; -- Glossary 참조
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**관리 방법:**
|
|
70
|
+
- `datacontext glossary add "활성 사용자" "status가 1인 사용자" --sql "status = 1"`
|
|
71
|
+
- `datacontext glossary generate "활성=status 1, VIP=주문 10건 이상"`
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 3. Business Rule (비즈니스 룰) ⚠️
|
|
76
|
+
|
|
77
|
+
**목적:** 모든 쿼리에 자동으로 적용되는 필터/제약
|
|
78
|
+
|
|
79
|
+
**사용 시점:** 쿼리 실행 전 시스템이 자동 적용
|
|
80
|
+
|
|
81
|
+
**핵심 특징:**
|
|
82
|
+
- **강제 적용** - 사용자가 명시하지 않아도 항상 추가
|
|
83
|
+
- **보안/무결성** - Soft delete, Tenant isolation 등
|
|
84
|
+
- **우선순위** - 여러 룰이 있으면 priority 순으로 적용
|
|
85
|
+
|
|
86
|
+
**예시:**
|
|
87
|
+
```yaml
|
|
88
|
+
name: "soft_delete_filter"
|
|
89
|
+
description: "삭제된 레코드 제외 (deleted_at IS NULL)"
|
|
90
|
+
condition: "deleted_at IS NULL"
|
|
91
|
+
appliesTo:
|
|
92
|
+
tables: ["users", "orders", "products"]
|
|
93
|
+
isActive: true
|
|
94
|
+
priority: 100
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**사용 시나리오:**
|
|
98
|
+
```
|
|
99
|
+
사용자: "SELECT * FROM users"
|
|
100
|
+
시스템 적용 후: "SELECT * FROM users WHERE deleted_at IS NULL"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**관리 방법:**
|
|
104
|
+
- VS Code: `DataContext: Add Business Rule`
|
|
105
|
+
- CLI: 현재 미구현 (향후 추가)
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 4. Query Example (쿼리 예시)
|
|
110
|
+
|
|
111
|
+
**목적:** 검증된 SQL 패턴 저장
|
|
112
|
+
|
|
113
|
+
**사용 시점:** AI가 유사한 쿼리 생성 시 참조
|
|
114
|
+
|
|
115
|
+
**예시:**
|
|
116
|
+
```yaml
|
|
117
|
+
intent: "최근 30일 주문 총액 조회"
|
|
118
|
+
sql: |
|
|
119
|
+
SELECT
|
|
120
|
+
user_id,
|
|
121
|
+
SUM(total_amount) as total_spent
|
|
122
|
+
FROM orders
|
|
123
|
+
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
|
|
124
|
+
GROUP BY user_id
|
|
125
|
+
tables: ["orders"]
|
|
126
|
+
isVerified: true
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**관리 방법:**
|
|
130
|
+
- VS Code: `DataContext: Add Query Example`
|
|
131
|
+
- 피드백에서 자동 생성 (성공한 쿼리)
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Glossary vs Rule: 언제 무엇을 사용?
|
|
136
|
+
|
|
137
|
+
### Glossary 사용 (용어 번역)
|
|
138
|
+
|
|
139
|
+
✅ 도메인 특화 용어가 있을 때
|
|
140
|
+
✅ 사용자가 자연어로 요청할 때
|
|
141
|
+
✅ 같은 개념에 여러 표현이 있을 때
|
|
142
|
+
|
|
143
|
+
**예시:**
|
|
144
|
+
- "활성 사용자", "VIP 고객", "최근 주문"
|
|
145
|
+
- 마케팅 용어, 비즈니스 지표
|
|
146
|
+
|
|
147
|
+
### Rule 사용 (자동 적용 필터)
|
|
148
|
+
|
|
149
|
+
✅ 항상 적용해야 하는 조건
|
|
150
|
+
✅ 보안/무결성 관련
|
|
151
|
+
✅ 사용자가 잊어버려도 적용되어야 함
|
|
152
|
+
|
|
153
|
+
**예시:**
|
|
154
|
+
- Soft delete 필터 (`deleted_at IS NULL`)
|
|
155
|
+
- Tenant isolation (`tenant_id = ?`)
|
|
156
|
+
- 권한 기반 필터 (`is_public = true OR owner_id = ?`)
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 스케일 대응 전략
|
|
161
|
+
|
|
162
|
+
### 테이블이 많아질 때
|
|
163
|
+
|
|
164
|
+
1. **태그로 그룹화**
|
|
165
|
+
```yaml
|
|
166
|
+
table: user_preferences
|
|
167
|
+
tags: ["user", "settings"]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
2. **스키마별 분리**
|
|
171
|
+
```
|
|
172
|
+
knowledge/
|
|
173
|
+
├── public/ # public schema
|
|
174
|
+
├── analytics/ # analytics schema
|
|
175
|
+
└── admin/ # admin schema
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### DB가 여러 개일 때
|
|
179
|
+
|
|
180
|
+
1. **DB별 Knowledge 분리**
|
|
181
|
+
```
|
|
182
|
+
.datacontext/
|
|
183
|
+
├── users-db/
|
|
184
|
+
│ └── knowledge.json
|
|
185
|
+
├── orders-db/
|
|
186
|
+
│ └── knowledge.json
|
|
187
|
+
└── analytics-db/
|
|
188
|
+
└── knowledge.json
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
2. **Cross-DB Glossary**
|
|
192
|
+
```yaml
|
|
193
|
+
term: "고객"
|
|
194
|
+
appliesTo:
|
|
195
|
+
databases:
|
|
196
|
+
- name: users-db
|
|
197
|
+
tables: ["users"]
|
|
198
|
+
- name: orders-db
|
|
199
|
+
tables: ["customers"]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 용어가 많아질 때
|
|
203
|
+
|
|
204
|
+
1. **카테고리 활용**
|
|
205
|
+
- `status`: 상태 관련 (활성, 비활성, 정지)
|
|
206
|
+
- `time`: 시간 관련 (최근, 이번달, 지난주)
|
|
207
|
+
- `money`: 금액 관련 (매출, 비용, 이익)
|
|
208
|
+
- `entity`: 엔티티 타입 (고객, 상품, 주문)
|
|
209
|
+
- `metric`: 지표 (전환율, 이탈률)
|
|
210
|
+
|
|
211
|
+
2. **검색 및 자동완성**
|
|
212
|
+
```bash
|
|
213
|
+
datacontext glossary search "사용자"
|
|
214
|
+
# → 활성 사용자, 신규 사용자, VIP 사용자, ...
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 권장 워크플로우
|
|
220
|
+
|
|
221
|
+
### 1단계: 기본 설정 (처음 연결 시)
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# DB 메타데이터 수집
|
|
225
|
+
datacontext harvest
|
|
226
|
+
|
|
227
|
+
# 기본 Soft Delete 룰 추가 (해당되는 경우)
|
|
228
|
+
# VS Code: DataContext: Add Business Rule
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 2단계: 도메인 용어 추가 (점진적)
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# 자주 사용하는 용어부터
|
|
235
|
+
datacontext glossary add "활성 사용자" "status가 1인 사용자" --sql "status = 1"
|
|
236
|
+
datacontext glossary add "최근 주문" "30일 이내 주문" --sql "created_at > now() - interval '30 days'"
|
|
237
|
+
|
|
238
|
+
# 또는 AI로 일괄 생성
|
|
239
|
+
datacontext glossary generate "활성=status 1, VIP=order 10건 이상, 신규=created_at 7일 이내"
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 3단계: 사용하면서 개선
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# 쿼리 피드백 기록 (자동)
|
|
246
|
+
# 자주 수정되는 패턴 → Rule 또는 Glossary 추가
|
|
247
|
+
|
|
248
|
+
# 성공한 쿼리 → Query Example로 저장
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## 요약
|
|
254
|
+
|
|
255
|
+
| 질문 | 답 |
|
|
256
|
+
|------|-----|
|
|
257
|
+
| "AI가 용어를 이해하게 하고 싶다" | → **Glossary** |
|
|
258
|
+
| "모든 쿼리에 조건을 자동 추가하고 싶다" | → **Rule** |
|
|
259
|
+
| "테이블 의미를 설명하고 싶다" | → **Table Description** |
|
|
260
|
+
| "좋은 쿼리 패턴을 저장하고 싶다" | → **Query Example** |
|
|
261
|
+
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
# Multi-Database Architecture
|
|
2
|
+
|
|
3
|
+
> DataContext의 다중 데이터베이스 지원 아키텍처 설계
|
|
4
|
+
|
|
5
|
+
## 현재 상태
|
|
6
|
+
|
|
7
|
+
현재 DataContext는 **단일 연결 기반** 으로 동작합니다:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────┐
|
|
11
|
+
│ VS Code Extension │
|
|
12
|
+
├─────────────────────────────────────────┤
|
|
13
|
+
│ ⭐ Active Connection │
|
|
14
|
+
│ └── REST API (localhost:3000) │
|
|
15
|
+
│ └── PostgreSQL (users-db) │
|
|
16
|
+
│ │
|
|
17
|
+
│ Connection 2 │
|
|
18
|
+
│ └── REST API (localhost:3001) │
|
|
19
|
+
│ └── MySQL (orders-db) │
|
|
20
|
+
└─────────────────────────────────────────┘
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- 각 연결은 독립적인 REST API 서버
|
|
24
|
+
- Knowledge는 DB별로 분리 저장 (`~/.datacontext/{db-id}/`)
|
|
25
|
+
- 한 번에 하나의 Active Connection만 사용
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 다중 DB 지원 전략
|
|
30
|
+
|
|
31
|
+
### Level 1: Multi-Connection UI (현재 완료 ✅)
|
|
32
|
+
|
|
33
|
+
여러 연결을 저장하고 전환하는 기능:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Features:
|
|
37
|
+
✅ 여러 연결 저장
|
|
38
|
+
✅ Active Connection 표시 (⭐)
|
|
39
|
+
✅ 클릭으로 연결 전환
|
|
40
|
+
✅ 연결 삭제/정리
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**한계:** 한 번에 하나의 DB만 조회 가능
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### Level 2: Unified Knowledge Layer (다음 단계)
|
|
48
|
+
|
|
49
|
+
여러 DB의 Knowledge를 통합하여 관리:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
┌─────────────────────────────────────────┐
|
|
53
|
+
│ Unified Knowledge Layer │
|
|
54
|
+
├─────────────────────────────────────────┤
|
|
55
|
+
│ │
|
|
56
|
+
│ Business Glossary │
|
|
57
|
+
│ ├── "고객" → users-db.users │
|
|
58
|
+
│ │ orders-db.customers │
|
|
59
|
+
│ │ │
|
|
60
|
+
│ ├── "VIP" → orders-db.customers │
|
|
61
|
+
│ │ WHERE total_orders >= 10 │
|
|
62
|
+
│ │ │
|
|
63
|
+
│ └── "매출" → orders-db.orders │
|
|
64
|
+
│ SUM(total_amount) │
|
|
65
|
+
│ │
|
|
66
|
+
│ Cross-DB Mappings │
|
|
67
|
+
│ └── users-db.users.id │
|
|
68
|
+
│ = orders-db.customers.user_id │
|
|
69
|
+
│ │
|
|
70
|
+
└─────────────────────────────────────────┘
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**구현 방법:**
|
|
74
|
+
|
|
75
|
+
1. **Global Knowledge Store**
|
|
76
|
+
```typescript
|
|
77
|
+
interface GlobalKnowledge {
|
|
78
|
+
databases: DatabaseKnowledge[];
|
|
79
|
+
crossDbMappings: CrossDbMapping[];
|
|
80
|
+
globalGlossary: BusinessTerm[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface CrossDbMapping {
|
|
84
|
+
source: { db: string; table: string; column: string };
|
|
85
|
+
target: { db: string; table: string; column: string };
|
|
86
|
+
relationship: 'equals' | 'foreign_key';
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
2. **Term Scope 확장**
|
|
91
|
+
```typescript
|
|
92
|
+
interface BusinessTerm {
|
|
93
|
+
term: string;
|
|
94
|
+
definition: string;
|
|
95
|
+
appliesTo: {
|
|
96
|
+
databases?: string[]; // 추가
|
|
97
|
+
tables?: string[];
|
|
98
|
+
columns?: string[];
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
3. **AI Context 확장**
|
|
104
|
+
```typescript
|
|
105
|
+
// 현재: 단일 DB 컨텍스트
|
|
106
|
+
buildContext(query, tables)
|
|
107
|
+
|
|
108
|
+
// 미래: 다중 DB 컨텍스트
|
|
109
|
+
buildCrossDbContext(query, {
|
|
110
|
+
databases: ['users-db', 'orders-db'],
|
|
111
|
+
tables: ['users', 'orders', 'customers']
|
|
112
|
+
})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
### Level 3: Federated Query (고급)
|
|
118
|
+
|
|
119
|
+
여러 DB를 하나의 쿼리로 조회:
|
|
120
|
+
|
|
121
|
+
```sql
|
|
122
|
+
-- 사용자가 원하는 것
|
|
123
|
+
SELECT u.name, SUM(o.total_amount) as revenue
|
|
124
|
+
FROM users u
|
|
125
|
+
JOIN orders o ON u.id = o.user_id
|
|
126
|
+
GROUP BY u.name
|
|
127
|
+
|
|
128
|
+
-- 실제 실행 (DB가 다를 때)
|
|
129
|
+
-- Step 1: users-db에서 사용자 조회
|
|
130
|
+
-- Step 2: orders-db에서 주문 조회
|
|
131
|
+
-- Step 3: 결과 조인 (클라이언트)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**구현 복잡도:** 매우 높음
|
|
135
|
+
|
|
136
|
+
**필요 기능:**
|
|
137
|
+
- Query Planner (DB별 쿼리 분리)
|
|
138
|
+
- Result Merger (클라이언트 조인)
|
|
139
|
+
- Type Mapping (DB간 타입 호환)
|
|
140
|
+
- Performance Optimization (병렬 실행)
|
|
141
|
+
|
|
142
|
+
**대안:**
|
|
143
|
+
- ETL + Data Warehouse (Snowflake, BigQuery)
|
|
144
|
+
- Trino/Presto (분산 쿼리 엔진)
|
|
145
|
+
- dbt (데이터 변환)
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 권장 구현 순서
|
|
150
|
+
|
|
151
|
+
### Phase 1: Multi-Connection 개선 (현재)
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
✅ 연결 저장/전환
|
|
155
|
+
✅ Active Connection UI
|
|
156
|
+
⏳ 연결 그룹화 (개발/스테이징/프로덕션)
|
|
157
|
+
⏳ 연결 복사/공유
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Phase 2: Unified Knowledge (다음)
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
⏳ Cross-DB Term 지원
|
|
164
|
+
⏳ Global Glossary
|
|
165
|
+
⏳ DB 간 테이블 매핑
|
|
166
|
+
⏳ 통합 검색
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Phase 3: Enhanced Query (미래)
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
⏳ Multi-DB 컨텍스트 인식
|
|
173
|
+
⏳ 자동 DB 선택 (용어 기반)
|
|
174
|
+
⏳ 기본 Cross-DB 조인 제안
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Phase 4: Federation (선택적)
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
⏳ 간단한 Cross-DB 쿼리
|
|
181
|
+
⏳ 결과 병합
|
|
182
|
+
⏳ Trino/Presto 통합 (외부)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Knowledge 저장 구조
|
|
188
|
+
|
|
189
|
+
### 현재 (DB별 분리)
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
~/.datacontext/
|
|
193
|
+
├── localhost_users_db/
|
|
194
|
+
│ └── knowledge.json
|
|
195
|
+
├── localhost_orders_db/
|
|
196
|
+
│ └── knowledge.json
|
|
197
|
+
└── localhost_analytics_db/
|
|
198
|
+
└── knowledge.json
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 제안 (계층적 구조)
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
~/.datacontext/
|
|
205
|
+
├── global/
|
|
206
|
+
│ ├── settings.json
|
|
207
|
+
│ ├── glossary.json # 전역 용어
|
|
208
|
+
│ └── mappings.json # DB 간 매핑
|
|
209
|
+
├── workspaces/
|
|
210
|
+
│ └── my-project/
|
|
211
|
+
│ ├── workspace.json # 프로젝트 설정
|
|
212
|
+
│ └── connections.json # 연결 목록
|
|
213
|
+
└── databases/
|
|
214
|
+
├── users-db/
|
|
215
|
+
│ └── knowledge.json
|
|
216
|
+
├── orders-db/
|
|
217
|
+
│ └── knowledge.json
|
|
218
|
+
└── analytics-db/
|
|
219
|
+
└── knowledge.json
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Glossary 스케일 대응
|
|
225
|
+
|
|
226
|
+
### 문제: 용어가 많아지면?
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
현재: 50개 용어 → 검색 O
|
|
230
|
+
미래: 500개 용어 → 검색 어려움
|
|
231
|
+
5000개 용어 → 관리 불가
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 해결책
|
|
235
|
+
|
|
236
|
+
1. **카테고리 필터링**
|
|
237
|
+
```
|
|
238
|
+
┌─ Business Glossary ──────────────┐
|
|
239
|
+
│ [Filter: 상태 ▼] [Search: ___] │
|
|
240
|
+
│ │
|
|
241
|
+
│ 📁 상태 (12) │
|
|
242
|
+
│ ├── 활성 사용자 │
|
|
243
|
+
│ ├── 휴면 계정 │
|
|
244
|
+
│ └── 정지 계정 │
|
|
245
|
+
│ │
|
|
246
|
+
│ 📁 시간 (8) │
|
|
247
|
+
│ ├── 최근 주문 │
|
|
248
|
+
│ └── 이번달 가입 │
|
|
249
|
+
└──────────────────────────────────┘
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
2. **Table 연결 기반 필터**
|
|
253
|
+
```
|
|
254
|
+
현재 쿼리: SELECT * FROM users WHERE ...
|
|
255
|
+
|
|
256
|
+
관련 용어만 표시:
|
|
257
|
+
├── 활성 사용자 (users.status = 1)
|
|
258
|
+
├── VIP 고객 (users.tier = 'vip')
|
|
259
|
+
└── 신규 가입자 (users.created_at > ...)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
3. **AI 기반 용어 추천**
|
|
263
|
+
```
|
|
264
|
+
쿼리: "이번달 매출 높은 고객"
|
|
265
|
+
|
|
266
|
+
추천 용어:
|
|
267
|
+
✓ 이번달 (created_at >= month_start)
|
|
268
|
+
✓ 매출 (SUM(total_amount))
|
|
269
|
+
✓ 고객 (users JOIN orders)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
4. **버전 관리**
|
|
273
|
+
```yaml
|
|
274
|
+
# glossary.yaml
|
|
275
|
+
version: 2
|
|
276
|
+
updated_at: 2025-01-01
|
|
277
|
+
terms:
|
|
278
|
+
- term: "활성 사용자"
|
|
279
|
+
version: 3
|
|
280
|
+
history:
|
|
281
|
+
- v1: status = 'active'
|
|
282
|
+
- v2: status = 1
|
|
283
|
+
- v3: status = 1 AND last_login > now() - interval '30 days'
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 결론
|
|
289
|
+
|
|
290
|
+
### 현재 우선순위
|
|
291
|
+
|
|
292
|
+
1. **Phase 1 완료** ✅
|
|
293
|
+
- Multi-Connection UI
|
|
294
|
+
- SQLite/MySQL/PostgreSQL 테스트
|
|
295
|
+
|
|
296
|
+
2. **Phase 2 준비**
|
|
297
|
+
- Global Glossary 설계
|
|
298
|
+
- Cross-DB Mapping 정의
|
|
299
|
+
- 카테고리 필터 UI
|
|
300
|
+
|
|
301
|
+
3. **Phase 3+ 유보**
|
|
302
|
+
- Federated Query는 복잡도가 높음
|
|
303
|
+
- 사용자 피드백 후 결정
|
|
304
|
+
|
|
305
|
+
### 핵심 원칙
|
|
306
|
+
|
|
307
|
+
1. **점진적 복잡도 증가**
|
|
308
|
+
- 단순한 것부터 시작
|
|
309
|
+
- 사용자 요구에 따라 확장
|
|
310
|
+
|
|
311
|
+
2. **독립성 유지**
|
|
312
|
+
- 각 DB의 Knowledge는 독립적
|
|
313
|
+
- 전역 레이어는 옵션
|
|
314
|
+
|
|
315
|
+
3. **AI 활용**
|
|
316
|
+
- 용어 추천/자동완성
|
|
317
|
+
- 컨텍스트 기반 필터링
|
|
318
|
+
- Cross-DB 관계 추론
|
|
319
|
+
|
package/package.json
CHANGED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Create SQLite test database with sample data
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
DB_PATH="${1:-./test-sqlite.db}"
|
|
7
|
+
|
|
8
|
+
echo "Creating SQLite test database at: $DB_PATH"
|
|
9
|
+
|
|
10
|
+
# Remove existing
|
|
11
|
+
rm -f "$DB_PATH"
|
|
12
|
+
|
|
13
|
+
# Create database and tables
|
|
14
|
+
sqlite3 "$DB_PATH" << 'EOF'
|
|
15
|
+
-- Users table
|
|
16
|
+
CREATE TABLE users (
|
|
17
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
18
|
+
name TEXT NOT NULL,
|
|
19
|
+
email TEXT UNIQUE NOT NULL,
|
|
20
|
+
status INTEGER DEFAULT 1,
|
|
21
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
22
|
+
deleted_at DATETIME
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
-- Products table
|
|
26
|
+
CREATE TABLE products (
|
|
27
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
28
|
+
name TEXT NOT NULL,
|
|
29
|
+
price REAL NOT NULL,
|
|
30
|
+
inventory INTEGER DEFAULT 0,
|
|
31
|
+
category TEXT,
|
|
32
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
-- Orders table
|
|
36
|
+
CREATE TABLE orders (
|
|
37
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
38
|
+
user_id INTEGER REFERENCES users(id),
|
|
39
|
+
product_id INTEGER REFERENCES products(id),
|
|
40
|
+
quantity INTEGER NOT NULL,
|
|
41
|
+
total_amount REAL NOT NULL,
|
|
42
|
+
status TEXT DEFAULT 'pending',
|
|
43
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
-- Insert sample data
|
|
47
|
+
INSERT INTO users (name, email, status) VALUES
|
|
48
|
+
('Alice', 'alice@example.com', 1),
|
|
49
|
+
('Bob', 'bob@example.com', 1),
|
|
50
|
+
('Charlie', 'charlie@example.com', 0),
|
|
51
|
+
('Diana', 'diana@example.com', 2);
|
|
52
|
+
|
|
53
|
+
INSERT INTO products (name, price, inventory, category) VALUES
|
|
54
|
+
('Laptop', 999.99, 50, 'electronics'),
|
|
55
|
+
('Mouse', 29.99, 200, 'electronics'),
|
|
56
|
+
('Keyboard', 79.99, 100, 'electronics'),
|
|
57
|
+
('Desk Chair', 299.99, 30, 'furniture');
|
|
58
|
+
|
|
59
|
+
INSERT INTO orders (user_id, product_id, quantity, total_amount, status) VALUES
|
|
60
|
+
(1, 1, 1, 999.99, 'delivered'),
|
|
61
|
+
(1, 2, 2, 59.98, 'delivered'),
|
|
62
|
+
(2, 3, 1, 79.99, 'shipped'),
|
|
63
|
+
(2, 4, 1, 299.99, 'pending');
|
|
64
|
+
|
|
65
|
+
SELECT 'SQLite test database created!' as result;
|
|
66
|
+
.tables
|
|
67
|
+
EOF
|
|
68
|
+
|
|
69
|
+
echo ""
|
|
70
|
+
echo "Database created: $DB_PATH"
|
|
71
|
+
echo ""
|
|
72
|
+
echo "To start DataContext server:"
|
|
73
|
+
echo " npx @kiyeonjeon21/datacontext serve sqlite:$DB_PATH --port 3000"
|
|
74
|
+
echo ""
|
|
75
|
+
|