Synapse Ontology Schema

AI-Readable Ontology — 테이블 명세 및 현황
Updated: 2026-04-16
1,597
Entities
8,417
Links
950
Events
349
Channels
~27K
Messages
181
Profiles
                     ┌──────────────────────────┐
                     │    ontology_entities      │ ◀── 모든 것의 중심
                     │    1,597 rows             │
                     └─────┬──────────┬──────────┘
                           │          │
               ┌───────────▼──┐  ┌───▼────────────┐
               │ontology_links│  │ ontology_events │
               │  8,417 rows  │  │   950 rows      │
               └──────────────┘  └─────────────────┘
                           │          │
               ┌───────────▼──────────▼──────────┐
               │ ontology_entity_activity_summary │ ◀── Materialized View
               └─────────────────────────────────┘

          ┌──────────────┐     ┌───────────────────────────┐
          │ slack_channels│────▶│ channel_activity_profiles  │
          │   349 rows   │     │   181 rows                 │
          └──────┬───────┘     └───────────────────────────┘
                 │
          ┌──────▼────────┐
          │ slack_messages │
          │  ~27,000 rows │
          └───────────────┘
ontology_entities Core
모든 오브젝트의 중심 테이블. 사람, 이슈, 문서, 채널, 회의 등 하나의 테이블에 저장.
PK: id UNIQUE: (entity_type, source, external_id) RLS ON Trigger: updated_at 자동갱신
컬럼타입NULL기본값설명
idUUIDNOgen_random_uuid()Primary Key
entity_typeTEXTNO엔티티 유형
sourceTEXTNO데이터 출처
external_idTEXTNO출처 시스템 내 고유 ID
canonical_emailTEXTYES사람 엔티티의 크로스시스템 식별자
display_nameTEXTNO''표시 이름
propertiesJSONBNO'{}'유형별 상세 속성
statusTEXTNO'active'active / archived / deleted
created_atTIMESTAMPTZNOnow()
updated_atTIMESTAMPTZNOnow()트리거로 자동 갱신
idx: entity_type idx: (entity_type, status) idx: canonical_email (partial) idx: source idx: updated_at DESC idx: properties (GIN) idx: display_name (GIN trigram) idx: full-text search (GIN)

entity_type 분포

  • space — Slack 채널349
  • issue — Jira 이슈265
  • absence — 부재/연차263
  • message — Slack 메시지239
  • meeting — 회의실 예약158
  • person — 조직 구성원133
  • document — Confluence 문서84
  • department — 부서51
  • announcement — 공지사항50
  • room — 회의실5
  • build — 빌드 배포0
  • workflow — KissFlow0
  • project — 프로젝트0

source 분포

  • slack588
  • synapse476
  • jira265
  • naver_works184
  • confluence84
  • github0
  • kissflow0
▶ properties: person
{
  "name_ko": "김윤지",
  "name_en": null,
  "department_id": "...",
  "department_name": "아트팀",
  "position": "팀원",
  "level_name": "매니저",
  "is_manager": false,
  "slack_id": "U02M3U2E0BG",
  "profile_image_url": "https://...",
  "hired_date": "2021-03-02",
  "cell_phone": "010-xxxx-xxxx"
}
▶ properties: issue (Jira)
{
  "key": "ER-1234",
  "summary": "시즌12 밸런스 조정",
  "status_name": "In Progress",
  "status_category": "indeterminate",
  "priority": "High",
  "issue_type": "Task",
  "url": "https://nimbleneuron.atlassian.net/browse/ER-1234"
}
▶ properties: space (Slack 채널)
{
  "channel_id": "C04L93F9EG6",
  "is_private": false,
  "is_archived": false,
  "topic": "QA 관련 논의",
  "member_count": 45,
  "channel_type": "deep_discussion",
  "activity_level": "high",
  "weekly_human_messages": 93,
  "thread_rate": 0.517,
  "peak_hour": 14,
  "top_keywords": ["시즌", "테스트", "QA"]
}
▶ properties: meeting
{
  "room_name": "씽크룸 3",
  "room_id": "62576/219964@r_62576_...",
  "summary": "시즌12 킥오프",
  "start_at": "2026-04-10T02:00:00Z",
  "end_at": "2026-04-10T03:00:00Z",
  "attendee_emails": ["a@nn.com", "b@nn.com"],
  "event_id": "...",
  "source": "naver_works"
}
▶ properties: document, absence, announcement, message, room, department
// document (Confluence)
{ "title": "시즌12 기획안", "space_key": "ER", "space_name": "이터널 리턴",
  "status": "current", "url": "https://...", "last_updated": "2026-04-10T05:30:00Z" }

// absence
{ "date": "2026-04-10", "type": "연차", "description": "개인 사유",
  "slack_message_ts": "1744..." }

// announcement
{ "summary": "시즌12 패치 안내", "original_text": "...",
  "user_name": "김지훈", "slack_ts": "1744..." }

// message
{ "channel_id": "C01B6EQ32L8", "channel_name": "deploy-dev",
  "text_preview": "빌드 v1.2.3 배포 완료", "thread_ts": null,
  "reply_count": 5, "is_thread_reply": false, "slack_ts": "1744..." }

// room
{ "room_id": "62576/219964@r_62576_...", "room_name": "씽크룸 3" }

// department
{ "parent_id": "...", "display_order": 3 }
ontology_links Core
엔티티 간 관계. 방향성 있음 (source → target). 시간 범위로 유효성 관리.
PK: id UNIQUE: (link_type, source_entity_id, target_entity_id, valid_from) FK: source_entity_id → entities ON DELETE CASCADE FK: target_entity_id → entities ON DELETE CASCADE RLS ON
컬럼타입NULL기본값설명
idUUIDNOgen_random_uuid()PK
link_typeTEXTNO관계 유형
source_entity_idUUIDNO출발 엔티티
target_entity_idUUIDNO도착 엔티티
propertiesJSONBNO'{}'관계 부가 속성
confidenceREALNO1.01.0=확정, <1.0=AI 추론
valid_fromTIMESTAMPTZNOnow()관계 시작 시점
valid_untilTIMESTAMPTZYESNULL = 현재 유효
created_atTIMESTAMPTZNOnow()

link_type 분포

  • attends — person → meeting3,258
  • belongs_to — person → dept, msg → space1,569
  • assigned_to — issue → person967
  • reported_by — issue → person815
  • organizes — person → meeting761
  • parent_of — dept → dept500
  • relates_to — issue → issue466
  • authored — person → message56
  • mentions — message → person25
  • blocks / manages / reviews / deployed_by / contributed_to / works_on / member_of0
ontology_events Core
발생한 이벤트(행위) 기록. 시계열 감사 로그 역할. idempotency_key로 중복 방지.
PK: id UNIQUE: idempotency_key FK: actor → entities ON DELETE SET NULL FK: subject → entities ON DELETE SET NULL FK: target → entities ON DELETE SET NULL RLS ON
컬럼타입NULL기본값설명
idUUIDNOgen_random_uuid()PK
actionTEXTNO행위 유형
actor_entity_idUUIDYES행위자
actor_emailTEXTYES행위자 이메일 (비정규화)
subject_entity_idUUIDYES대상 엔티티
subject_typeTEXTYES대상 entity_type (비정규화)
target_entity_idUUIDYES간접 대상
propertiesJSONBNO'{}'이벤트 부가 정보
occurred_atTIMESTAMPTZNOnow()실제 발생 시각
idempotency_keyTEXTYES중복 방지 키
created_atTIMESTAMPTZNOnow()

action 분포

  • status_changed — Jira 이슈 상태 변경324
  • scheduled — 부재/연차 등록263
  • created — Slack 메시지 작성239
  • updated — Confluence 문서 수정99
  • mentioned — Slack 멘션25
  • completed / commented / assigned / merged / deployed / attended / approved / rejected / published / reviewed / cancelled0
ontology_entity_activity_summary Materialized View
사람별 일별 활동 요약. REFRESH MATERIALIZED VIEW로 갱신.
컬럼타입설명
actor_entity_idUUID행위자
actor_emailTEXT행위자 이메일
activity_dateTIMESTAMPTZ일자 (KST date_trunc)
event_countBIGINT총 이벤트 수
distinct_actionsBIGINT고유 행위 유형 수
distinct_subjectsBIGINT고유 대상 수
actionsTEXT[]행위 유형 배열
slack_channels Operational
Slack 채널 메타데이터. ontology_entities(space) 및 channel_activity_profiles의 원본.
PK: id (Slack 채널 ID) RLS ON
컬럼타입NULL기본값설명
idTEXTNOSlack 채널 ID
nameTEXTNO채널명
is_privateBOOLEANNOfalse
is_archivedBOOLEANNOfalse
topicTEXTYES''
purposeTEXTYES''
member_countINTEGERYES0
last_synced_tsTEXTYES마지막 동기화 메시지 ts (커서)
synced_atTIMESTAMPTZYES
created_atTIMESTAMPTZNOnow()
slack_messages Operational
Slack 메시지 본문. 가장 큰 테이블. Full-text search 지원.
PK: (channel_id, ts) FK: channel_id → slack_channels ON DELETE CASCADE RLS ON
컬럼타입NULL기본값설명
channel_idTEXTNOFK → slack_channels
tsTEXTNOSlack 메시지 타임스탬프
user_idTEXTYESSlack 유저 ID
textTEXTNO''메시지 본문
thread_tsTEXTYES스레드 부모 ts (NULL=최상위)
reply_countINTEGERNO0
subtypeTEXTYES메시지 서브타입
is_botBOOLEANNOfalse
reactionsJSONBYES'[]'
filesJSONBYES'[]'
edited_atTIMESTAMPTZYES
message_atTIMESTAMPTZNO실제 메시지 시각
synced_atTIMESTAMPTZNOnow()
channel_activity_profiles Derived
채널별 활동 분석 프로파일. 7일 롤링 윈도우, ontology-sync 크론으로 주기적 재계산.
PK: channel_id FK: channel_id → slack_channels RLS ON
컬럼타입NULL기본값설명
channel_idTEXTNOPK, FK
period_startTIMESTAMPTZNO분석 기간 시작
period_endTIMESTAMPTZNO분석 기간 종료
total_messagesINTEGER0전체 메시지
human_messagesINTEGER0사람 메시지
bot_messagesINTEGER0봇 메시지
thread_repliesINTEGER0스레드 답글
unique_usersINTEGER0고유 참여자
thread_rateREAL0스레드 비율 (0~1)
msgs_per_userREAL0인당 메시지
channel_typeTEXTYES채널 유형 분류
activity_levelTEXTYES활동 수준
peak_hourINTEGERYES피크 시간 (0~23 KST)
weekend_ratioREAL0주말 메시지 비율
hourly_distributionJSONB'{}'시간대별 분포
daily_distributionJSONB'{}'요일별 분포
top_keywordsJSONB'[]'상위 키워드
user_overlapJSONB'[]'채널 간 사용자 교차 (미구현)
computed_atTIMESTAMPTZnow()계산 시각

channel_type 분류 기준

  • deep_discussionthread_rate > 0.4
  • broadcastthread_rate < 0.2 & users > 10
  • small_groupunique_users ≤ 3
  • mixed그 외

activity_level 분류 기준

  • high (6)human_messages ≥ 50
  • medium (13)20 ~ 49
  • low (161)1 ~ 19
  • dormant (1)0
데이터 흐름
운영 테이블 / 외부 API → Ontology 동기화 매핑
원본행수→ entity_type동기화 함수
org_members133personsyncOrgMembers()
org_departments51departmentsyncOrgDepartments()
room_reservations282meeting, roomsyncMeetings(), syncRooms()
absent_records931absencesyncAbsences()
announcements_cache55announcementsyncAnnouncements()
slack_channels349spacesyncSlackChannelsToOntology()
slack_messages~27KmessagesyncSlackMessagesToOntology()
Jira Cloud APIissuesyncJiraIssues()
Confluence Cloud APIdocumentsyncConfluencePages()
Slack build 채널buildsyncBuilds()
Upsert 패턴: 모든 동기화는 idempotent. Entity는 (entity_type, source, external_id) 기준, Event는 idempotency_key 기준, Link는 기존 active soft-delete 후 재생성.