728x90
반응형
Indexes
Multiple Fields
인덱스는 데이터 검색 속도 향상 또는 unique를 정의하기 위해 하나 이상의 필드를 구성할 수 있다.
func (User) Indexes() []ent.Index {
return []ent.Index{
index.Fields("field1", "field2"),
index.Fields("first_name", "last_name").//unique인덱스
Unique(),
}
}
하나의 필드만 unique를 정의하려면 Fields()에서 정의할 수 있다.
Index On Edges
필드 및 edge의 구성에 따라 인덱스를 사용할 수 있다. 주로 관계에서 필드의 unique를 설정하기 위해 사용한다.
ex) 한 city에서 street의 이름은 unique하다.(다른 도시에 같은 이름의 street이 있을 수 있다.)
//ent/schema/city.go
func (City) Fields() []ent.Field {
return []ent.Field{
field.String("name"),
}
}
func (City) Edges() []ent.Edge {
return []ent.Edge{
edge.To("streets", Street.Type),
}
}
//ent/schema/street.go
func (Street) Fields() []ent.Field {
return []ent.Field{
field.String("name"),
}
}
func (Street) Edges() []ent.Edge {
return []ent.Edge{
edge.From("city", City.Type).
Ref("streets").//street 테이블에 city_streets 컬럼이 생긴다.
Unique(),
}
}
func (Street) Indexes() []ent.Index {
return []ent.Index{
index.Fields("name").//field name과 edge city는 unique하다.
Edges("city").//city_streets는 같은 street이름을 가진 로우가 같은 city_streets를 가질 수 없다.
Unique(),
}
}
Index On Edge Fields
edges 컬럼은 fields 컬럼들 뒤에 추가가 되는데(fields에 정의하지 않고 edge에 관계만 정의함으로써 컬럼이 생긴다.) 몇몇 index 정의에서는 fields에 먼저 정의해야 된다.
func (Card) Fields() []ent.Field {
return []ent.Field{
field.String("number").
Optional(),
field.Int("owner_id").
Optional(),
}
}
func (Card) Edges() []ent.Edge {
return []ent.Edge{
edge.From("owner", User.Type).
Ref("card").
Field("owner_id").//연관된 필드를 미리 정의해놓고 연결시킨다.
Unique(),
}
}
func (Card) Indexes() []ent.Index {
return []ent.Index{
index.Fields("owner_id", "number"),
}
}
Dialect Support
annotation을 이용해서 각 DBMS의 Dialect(DB마다 다른 특성을 지니고, 사용되는 기능이 있는데, 그러한 기능)을 사용할 수 있다.
ex) MySQL의 Prefix(prefix 인덱스 - 인덱스의 파티션 키 컬럼과 인덱스를 구성하는 첫 번째 컬럼이 동일한 파티션 인덱스)
func (User) Indexes() []ent.Index {
return []ent.Index{
index.Fields("description").
Annotations(entsql.Prefix(128)),
index.Fields("c1", "c2", "c3").
Annotation(
entsql.PrefixColumn("c1", 100),
entsql.PrefixColumn("c2", 200),
)
}
}
결과 DDL
CREATE INDEX `users_description` ON `users`(`description`(128))
CREATE INDEX `users_c1_c2_c3` ON `users`(`c1`(100), `c2`(200), `c3`)
728x90
반응형
'Golang > ORM' 카테고리의 다른 글
[Entgo] About Annotations (0) | 2022.09.03 |
---|---|
[Entgo] About Mixin (0) | 2022.09.01 |
[Entgo] About Edges (0) | 2022.08.29 |
[Entgo] About Fields (0) | 2022.08.28 |
[Entgo] Entgo ORM란 (0) | 2022.08.18 |