모든 model 에 대해서 기본적인 column(attribute) 가 존재하긴 하지만 사용하는 사람 입장에서는 여러 자유도를 갖기를 원한다. 그래서 많은 서비스들은 custom column 을 추가할 수 있는 기능을 제공한다. 이를 위해 Entity–attribute–value model (https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model ) 을 구현해야 한다. 이 대신 json 이라는 구조를 사용할 수도 있다.  mysql 이나 postgresql 에서 json 이나 josnb 구조를 제공한다. 이를 이용해 자유롭게 정의 가능한 custom column 을 제공한다.

 

제공 가능한 data type 들은 number, string 형이다. 여기에 string 형에 일정한 format 을 갖추어, date(YYYY-MM-DD), time(HH:MM:SS), datetime(YYYY-MM-DD HH:MM:SS) 을 제공할 수 있다. number 형도 string format 을 제공해 decimal 형도 제공할 수 있다. (json 이나 jsonb 를 사용하는 경우 number 형의 경우 유효숫자에 제한이 있을 수 있으므로 string format 형이 더 좋을 것으로 보인다. )


 그리고 json 이나 jsonb 의 경우 array 나 dictionary 형으로도 custom column 을 제공할 수 있다. 

 기본적인 Data type에 추가적으로 다른 model 도 custom field 가 될 수 있다.  EAV Model 이나 json 을 이용하는 형태는 foreign key 를 제공할 때, 제약(restrict)을 database 를 이용해서 걸기가 어렵다. 이를 위해 Many-to-many 용 association table 을 미리 만들어 둘 수 있다. 

 Product 는 판매 상품에 대한 정보이다. 일반적으로 cost 정보를 가지고 있다. 경우에 따라서는 구매가, 판매가가 따로 존재해서 상품에 대한 순이익을 구할 수 있도록 할 수도 있다. Product 는 보유량이라는 개수를 가질 수 있다. 파는 상품이 디지털 상품일 경우 보유량에 무관하게 판매할 수 있다. 실물 상품일 경우 이 개수가 0 이라면 판매할 수 없다. 

 Deal 은 장바구니라고 해서 여러 Product 를 가지고 있을 수 있다. 장바구니 안에는 product 와 가격, 그리고 갯수를 가질 수 있다. 

 

 Person 은 연락처의 개념이다. 고객, 소비자, 협력사의 직원, 제휴사의 직원 모두 person 이 될 수 있다. 이들의 구별을 위해 category 라는 필드를 둘 수 있다. 기본적으로 이름으로 이루어져 있으면 여러개의 전화번호,전화번호 종류(work/home/other) 와 이메일/이메일 종류(work/home/other) 로 이루어져 있다. 핸드폰 전화번호부에 여러 전화번호를 입력할 수 있는 것과 동일하다. 

 Organization 은 Person 이 속한 조직을 말한다. Organization 은 여러 Person 을 가지고 있다. 하나의 Person 은 여러 Organization 에 속할 수 있다. Organization 도 전화번호,전화번호 종류(work/home/other) 와 이메일/이메일 종류(work/home/other) 이루어져 있다. 그리고 address 라는 속성도 있다. Organization  는 협력사, 고객, 제휴사 등 모두 될 수 있다. 이를 구별하기 위해 category 라는 필드를 가지고 있다.