Tendo a scorrere iterate entrambe le volte.
Di solito inizio disegnando il modello, poiché alla fine della giornata è la cosa più importante da ottenere a lungo termine.
Ma considero anche l'interfaccia utente, chiedendomi in che modo quest'ultimo influisce sul modello. Ci sono occasioni in cui il modello è giusto sulla carta ma porta a uno o entrambi i problemi di interfaccia utente e problemi di prestazioni. Adeguo il modello di conseguenza.
Ad esempio, prendi utenti e indirizzi. L'idea naturale è di normalizzare la cosa al punto in cui hai utenti, indirizzi, città, stati, paesi e una tabella user2ddress per una relazione n-n.
Ma se consideri le implicazioni dell'interfaccia utente e come potrebbe funzionare in un editor, l'ultima cosa che vuoi è un utente confuso che modifica l'indirizzo di qualcuno e finisce per cambiare l'indirizzo di molti altri. Si finisce per abbandonare la tabella user2address e attenersi a un campo user_id negli indirizzi (quindi una relazione 1-n).
(Non escludo l'esempio da stupido, in realtà ho visto questo nella realtà per i nomi e gli indirizzi di società su un sistema che aveva una tabella contact2company. Una segretaria ha cambiato il nome e l'indirizzo di un'azienda perché un contatto aveva una nuova datore di lavoro: ciò ha comportato un ingresso quasi duplice nelle aziende e ha modificato in modo errato l'indirizzo postale di numerosi altri contatti).
Il punto è, ci sono casi in cui l'interfaccia utente porta a modificare il modello e viceversa.
Un altro punto cruciale, che non hai menzionato ma che penso sia ugualmente se non più importante, sono i casi limite delle regole aziendali. In questi, "sempre" significa in realtà "di solito" e "mai" significa "raramente".
Ad esempio, ho visto negozi le cui tabelle degli ordini erano legate a un singolo prodotto e due date (order_date / clear_date). Ho detto buona fortuna con questo se hai bisogno di un ordine con più prodotti o se si verifica un chargeback o un rimborso parziale.