# 테이블 관계

## Content

데이터 매니저는 테이블 간 관계 정의를 지원합니다.
관계는 한 테이블의 필드를 다른 테이블의 필드와 연결합니다.
관계가 생성되면 관계 이름을 사용하여 관련 테이블의 필드에 접근할 수 있습니다.
관계는 `DataManager` 수준에서 정의됩니다.

## 관계 생성

[`addRelationship`](/spreadjs/api/classes/GC.Data.DataManager#addrelationship)을 사용하여 두 테이블 간의 관계를 정의합니다.

```javascript
dataManager.addRelationship(
  sourceTable,
  sourceFieldName,
  sourceRelationshipName,
  targetTable,
  targetFieldName,
  targetRelationshipName
);
```

### 매개 변수

* **sourceTable** - 관계가 정의되는 원본 테이블입니다.
* **sourceFieldName** - 매칭에 사용되는 원본 테이블의 필드입니다.
* **sourceRelationshipName** - 원본 테이블에서 관련 테이블에 접근할 때 사용하는 관계 이름입니다.
* **targetTable** - 관련 대상 테이블입니다.
* **targetFieldName** - 매칭에 사용되는 대상 테이블의 필드입니다.
* **targetRelationshipName** - 대상 테이블에서 원본 테이블에 접근할 때 사용하는 관계 이름입니다.

이 메서드는 관계를 설명하는 `IRelationship` 객체를 반환합니다.

## 예제

```javascript
const dataManager = spread.dataManager();

const orders = dataManager.addTable("orders", {
  data: [
    { orderId: 1, orderDate: "2024-01-01", employeeId: 100 },
    { orderId: 2, orderDate: "2024-01-02", employeeId: 101 }
  ]
});

const employees = dataManager.addTable("employees", {
  data: [
    { employeeId: 100, firstName: "Nancy", title: "Manager", address: "Seattle" },
    { employeeId: 101, firstName: "Andrew", title: "Sales", address: "Tacoma" }
  ]
});

// 관계 생성
const relationship = dataManager.addRelationship(
  orders,
  "employeeId",
  "employee",
  employees,
  "employeeId",
  "orders"
);

// View에서 관련 필드 접근
const myView = orders.addView("myView", [
  { value: "orderId" },
  { value: "orderDate" },
  { value: "employee.firstName" },
  { value: "employee.title" },
  { value: "employee.address" }
]);
```

이 예제에서:

* `"employee"`는 `orders` 테이블에 정의된 관계 이름입니다.
* 관련 테이블 필드는 점 표기법을 사용하여 접근합니다.

```javascript
relationshipName.fieldName
```

## 관련 데이터 접근

관계가 생성된 후 관련 필드는 View에서 다음 형식으로 참조할 수 있습니다.

```javascript
relationshipName.fieldName
```

예제:

```javascript
{ value: "employee.firstName" }
```

관계 이름은 관련 테이블로 이동하기 위한 탐색 경로 역할을 합니다.

## 관계 저장

관계는 `DataManager`에 저장됩니다.
`addRelationship`를 호출할 때마다 새로운 관계 항목이 생성됩니다.
동일한 `DataManager` 내에 여러 관계가 공존할 수 있습니다.
관계 이름은 개발자가 정의합니다. API는 관계 이름의 고유성을 강제하지 않습니다.

## 관계 제거

관계를 제거하려면 `removeRelationship`를 사용합니다.

```javascript
dataManager.removeRelationship("employee");
```

관계가 제거되면 해당 관계 이름을 통한 관련 필드 접근은 더 이상 사용할 수 없습니다.