PostgreSql - Many to Many relations

Viewed 44

i am fairly new to postgres and trying to create database model's for a app user typeorm.I have a item(product) model and user model.A user can save multiple items to their wishlist/favourutes and one item can be saved by multiple users as well. I am having problem in creating a SavedItems table which will consist info about which user have saved what item. My query is should i create a third model SavedItems or use @JoinTable which creates a table automatically?

**Item model**
@Entity()
export default class Item extends Base {

@Column()
@Index()
user_id: number

@ManyToOne(() => User, user => user.items, {onDelete: 'CASCADE'})
@JoinColumn({name: 'user_id', referencedColumnName: 'id'})
user: User

@Column()
images: Array<string>

@Column()
description: string

@Column()
brand: string

@Column()
item_type: string

@Column()
material: string

@Column()
length: number

@Column()
neckline: string

@Column()
sleeve_length: number

@Column()
body_fit: string

@Column()
size: number

@Column()
colors: Array<string>

@Column()
hire_price: number

@Column()
retail_price: number

@Column()
dry_cleaning_price: number

@Column()
bond_price: number

@Column()
@Index()
category_id:number

@ManyToOne(() => Category, category => category.items, {onDelete: 'CASCADE'})
@JoinColumn({name: 'category_id', referencedColumnName: 'id'})
category: Category

@Column()
@Index()
sub_category_id: number 

@ManyToOne(() => SubCategory, sub_category => sub_category.items, {onDelete: 'SET NULL'})
@JoinColumn({name: 'sub_category_id', referencedColumnName: 'id'})
sub_category: SubCategory

@Column()
@Index()
rating: number

@Column()
is_available: boolean

@Column()
hire_period: number

@Column()
additional_per_day_cost: number

@Column()
model_id: number

@ManyToOne(() => ModelProfile, model_profile => model_profile.items, {onDelete: 'SET NULL'})
@JoinColumn({name: 'model_id', referencedColumnName: 'id'})
model: ModelProfile

@Column('int')
status: status

@Column()
reason: string

@Column()
orders_accpeted_in: string

@Column()
global_countries: Array<string>

@Column()
contact_first_name: string

@Column()
contact_last_name: string

@Column()
contact_country_code: string

@Column()
contact_mobile_number: string

@Column()
address_id: number

@Column()
is_trending:boolean

@ManyToOne(() => Address, address => address.items, {onDelete: 'SET NULL'})
@JoinColumn({name: 'address_id', referencedColumnName: 'id'})
address: Address


@OneToMany(() => ItemDelivery, item_delivery => item_delivery.item)
delivery_options: ItemDelivery[]

@OneToMany(() => ItemReports, item_reports => item_reports.item_id)
reports: ItemReports[]

@OneToMany(() => ItemViews, item_views => item_views.item)
views: ItemViews[]

@ManyToMany(() => Order, order => order.items)
orders: Order[]

@OneToMany(() => Reward, reward => reward.item)
rewards: Reward[]
// @ManyToMany(() => User, user => user.saved_items )


}

User model

@Entity()
export default class User extends Base {


@Column()
full_name: string

@Column()
username: string

@Column()
display_name: string

@Column()
profile_image: string

@Column()
cover_image: string

@Column()
@Index()
email: string

@Column()
is_email_verified: boolean

@Column()
country_code: string

@Column()
phone_number: string

@Column({select: false})
password: string

@Column()
two_factor_auth: boolean

@Column()
two_factor_text: string

@Column()
otp: string

@Column()
otp_sent_at: string

@Column()
verification_level: string

@Column()
dob: Date

@Column()
is_disable: boolean

@Column()
disable_reason: string

@Column()
stripe_customer_id: string

@Column()
is_driver_license_verified: boolean

@Column()
is_postal_address_verified: boolean

@Column()
default_location: Geometry

@Column()
default_dress_size: string

@Column()
default_shoes_size: string

@Column()
redeem_points: string

@Column()
invite_link: string

@Column()
last_active: Date

@Column()
seller_link: string

@Column()
is_blocked: boolean

@Column()
is_holiday_mode: boolean

@Column()
holiday_mode_start: Date

@Column()
holiday_timezone: string

@Column()
is_trending: boolean

@OneToMany(() => Item, item => item.user)
items: Item[]

@OneToOne(() => ModelProfile, model_profile => model_profile.user)
model: ModelProfile

@OneToMany(() => Address, address => address.user)
address: Address[]

@OneToMany(() => Order, order => order.buyer)
buy_orders: Order

@OneToMany(() => Order, order => order.seller)
sell_orders: Order

@OneToMany(() => Conversation, conversation => conversation.sender)
conversations_initiated: Conversation[]

@OneToMany(() => Conversation, conversation => conversation.receiver)
conversations_partner: Conversation[]

@OneToMany(() => Messages, messages => messages.sender_id)
message_sent : Messages[]

@OneToMany(() => Messages, messages => messages.receiver_id)
message_received : Messages[]

@OneToMany(() => ItemViews, item_views => item_views.item)
viewed_items: ItemViews[]

@OneToMany(() => ItemReports, item_reports => item_reports.item)
item_reports: ItemReports[]

@OneToMany(() => ModelClaims, model_claims => model_claims.user)
model_profile_claim: ModelClaims[]

@OneToMany(() => BlockedUsers, blocked_users => blocked_users.user)
blocked_users: BlockedUsers[]

@OneToMany(()=> BlockedUsers, blocked_users => blocked_users.blocked_user_id)
blocked_by: BlockedUsers[]

@OneToMany(()=> ModelReports, model_reports => model_reports.model)
model_reports: ModelReports[]

@OneToMany(() =>UserVerificationRequests, user_verification_requests => user_verification_requests.user)
verification_requests: UserVerificationRequests[]

@OneToMany(() => UserReports, user_reports => user_reports.user)
user_reports: UserReports

@OneToMany(() => UserReports, user_reports => user_reports.reported_user)
reports_received: UserReports

@OneToMany(() => Session, session => session.user)
sessions: Session[]    

}
0 Answers
Related