# ER図

## 概要

serve-dプロジェクトにおけるデータストア間の関連を示すER図。serve-dは従来のリレーショナルデータベースを使用せず、インメモリデータ構造とファイルベースのバイナリキャッシュを採用しているため、本図はエンティティ間の論理的な関連を表現する。

## ER図（mermaid形式）

```mermaid
erDiagram
    IndexCache {
        string fileName PK "ルックアップキー"
        string modName "モジュール名"
        long lastModified "最終更新日時"
        ulong fileSize "ファイルサイズ"
        bool hasMixin "mixin有無"
    }

    ImportCacheEntry {
        string moduleName PK "モジュール名（キー）"
        bool success "インデックス成功"
        string fileName "ファイルパス"
        SysTime lastModified "最終更新日時"
        ulong fileSize "ファイルサイズ"
        bool isIncomplete "不完全フラグ"
    }

    DefinitionElement {
        string name "シンボル名"
        int line "行番号"
        char type "種別（c,s,i,T,f,g,u,e,v,a,I等）"
        bool insideFunction "関数内定義"
        bool insideAggregate "集約型内定義"
        int rangeStart "範囲開始"
        int rangeEnd "範囲終了"
    }

    Document {
        string uri PK "ドキュメントURI"
        string languageId "言語識別子"
        long version_ "バージョン"
        string text "テキスト内容"
    }

    TextDocumentManager {
        string documentStoreKey PK "DocumentUri"
    }

    UserConfiguration {
        string workspaceUri PK "ワークスペースURI"
    }

    UserConfiguration_D {
        string stdlibPath "標準ライブラリパス"
        string dcdClientPath "DCDクライアントパス"
        string dcdServerPath "DCDサーバパス"
        string dubPath "DUBパス"
        bool enableLinting "リンティング有効"
        bool enableAutoComplete "自動補完有効"
        bool enableIndex "インデックス有効"
    }

    UserConfiguration_DFmt {
        bool alignSwitchStatements "switch文整列"
        string braceStyle "波括弧スタイル"
        bool outdentAttributes "属性アウトデント"
    }

    BackendConfiguration {
        string componentName PK "コンポーネント名"
        string key PK "設定キー"
        string value "設定値（SumType）"
    }

    ProfileGCCache {
        string uri PK "DocumentUri"
    }

    ProfileGCEntry {
        size_t bytesAllocated "割り当てバイト数"
        size_t allocationCount "割り当て回数"
        string type "関数名/型名"
        string uri "ファイルURI"
        uint line "行番号"
    }

    Workspace {
        string folderUri PK "ワークスペースURI"
        string folderName "ワークスペース名"
        bool initialized "初期化済み"
        bool disabled "無効化"
        bool selected "アクティブ"
        bool useGlobalConfig "グローバル設定使用"
    }

    WorkspaceDInstance {
        string cwd PK "作業ディレクトリ"
    }

    CompileCache {
        string code PK "インポートコード"
        SysTime at "キャッシュ時刻"
        int ret "コンパイル時間ms"
    }

    IndexComponent {
        string workspaceCwd PK "ワークスペースCWD"
    }

    IndexCache ||--o{ DefinitionElement : "contains (elements)"
    ImportCacheEntry ||--o{ DefinitionElement : "contains (_definitions)"
    ImportCacheEntry ||--o{ DefinitionElement : "contains (_allImports)"
    IndexComponent ||--o{ ImportCacheEntry : "manages (cache)"
    IndexComponent ||--|| IndexCache : "persists to (fileIndex)"
    TextDocumentManager ||--o{ Document : "stores (documentStore)"
    ProfileGCCache ||--o{ ProfileGCEntry : "contains (entries)"
    Workspace ||--|| UserConfiguration : "references (config)"
    Workspace ||--|| WorkspaceDInstance : "corresponds to"
    WorkspaceDInstance ||--|| BackendConfiguration : "holds (config)"
    WorkspaceDInstance ||--|| IndexComponent : "contains"
    UserConfiguration ||--|| UserConfiguration_D : "contains (d)"
    UserConfiguration ||--|| UserConfiguration_DFmt : "contains (dfmt)"
```

## 関連の説明

| 関連 | 多重度 | 説明 |
| --- | --- | --- |
| IndexCache - DefinitionElement | 1:N | IndexCacheの各ファイルエントリは複数のDefinitionElement（シンボル定義）を保持する |
| ImportCacheEntry - DefinitionElement | 1:N | ImportCacheEntryは_definitions（全シンボル定義）と_allImports（インポート定義のサブセット）を保持する |
| IndexComponent - ImportCacheEntry | 1:N | IndexComponentはModuleRefをキーとした連想配列でImportCacheEntryを管理する |
| IndexComponent - IndexCache | 1:1 | IndexComponentはIndexCacheを通じてインデックス情報をディスクに永続化する |
| TextDocumentManager - Document | 1:N | TextDocumentManagerはDocumentUriをキーとしてDocumentを連想配列で管理する |
| ProfileGCCache - ProfileGCEntry | 1:N | ProfileGCCacheは各URIに対して複数のProfileGCEntryを保持する |
| Workspace - UserConfiguration | 1:1 | 各WorkspaceはperWorkspaceConfigurationStoreまたはglobalConfigurationから設定を参照する |
| Workspace - WorkspaceDInstance | 1:1 | 各Workspaceはworkspace-dバックエンドの対応するInstanceと紐づく |
| WorkspaceDInstance - BackendConfiguration | 1:1 | 各Instanceは自身のBackend Configurationを保持する |
| WorkspaceDInstance - IndexComponent | 1:1 | 各InstanceはIndexComponentをアタッチできる |
| UserConfiguration - D/DFmt | 1:1 | UserConfigurationはD, DFmt等のネスト構造体を内部に保持する |
