rest - how to represent relationship value on parent for simple entities -
this question best practices , design patterns; i'm sure can go option depending on app, want develop backend best practices regardless of front app/client current needs are.
what best practice follow during api development when resource has one-many/many-many relation resource, okay add columns 1 resource other represent important column i'm sure mandatory needed ?
#example database may like:- event{ id: 1, user_id: 1 } user:{ id: 1, name: 'momen', } now respond /post/1
## option 1 event{ id:1, user_id:1, user:{ id:1, name: momen, } } ## option 2 events{ 1: event{ id:1, user_id:1, user_name: 'momen',// not include user object unless client request it.. inject user_name because it's data i'm sure post need } } the user object in above example can huge, , don't want whole user object, -unless app needs more info user- yet still need name display in list of events. okay add name event object fallback, if client dont have access user:1 in memory, can display column while fetching user.
q1 acceptable or i'm polluting object , introducing anomily bugs ?
in case of many-to-many relation; have flag want set, should set on parent entity or have include relation object well.
eventuser{ event_id: 1, user_id: 1, } adding eventusers link table represents one-many relation,
q2. want set flag next event indicates if user querying events going event or not.
so in restful-api, respond get /events/1 request can
## option 1: event{ id:1, name: 'event 1', is_going: true } ## option 2 { events:{ 1:{id:1, name:'event 1'} }, eventuser:{1:{ event_id: 1, user_id: 1},} // or {} if not going } its clear option1 easier implement , easier deal with.. mean again i'm introducing columns event model not exists. plus if client going cache such results offline-first usage, , user changes data wrong.
my experience api's more data bargained , objects highly decoupled.
in case keep users array of independent objects under events , allow on explicit results. can add fields optional parameter in api payload user can decide fields interesting (on side implement obj_res = _.pick(obj, fields) )
never concatenate objects, lead nightmare when objects change , grow on time. coupling bad :)
Comments
Post a Comment