Good Design Practice
   
  Lay out columns in sequence of use
 
Make the most important column in the table as the first column of every table (after the Id)
 
Use embedded underscores in column and table names - the label generator recognizes that
 
Use Java naming conventions wherever possible.
 
Migrate template changes to meta-template level as quickly as possible.
 
Use the CSS extensively - add classes to the site-level CSS where needed.
 
Use the topSort to enter data into a new site.
 
responseMap.xml is a list that carries each page and its response, if not default.
 
The database server IP address is in the site config file, if you need to re-host your database.
 
Use the JavaScript directory to add new JavaScript functionality.
 
Use the guidelines for creating custom objects to extend server-side functionality. 
Refrain from using database-specific keyword like SYSDATE. Instead, use functions that you can implement directly through the UDM. Let's consider an example: 

Let's say, you need to send e-mails to a group of people at one go. You can build this feature by using an action sequence. A check is made at the back-end to verify the date on which the mail  needs to be sent to any given group. To make this verification, you could apply a filter to a node in an action sequence. It goes something like this:

table_name.column_name = sysdate (where column_name is a date field)

The filter should be able to retrieve Sysdate, match it with the actual date specified for the mails to be sent, and thereafter, fetch the correct records from the table concerned. However, this doesn't seem to work.

Incidentally, if you set date in the filter as greater than or equal to the sysdate or even less than or equal to the sysdate, the filter works out fine. For one thing,  Sysdate is Oracle-specific. For another thing, there is a good bit of SQL parsing that the zeroCode engine performs, and the use of features like the one described above, violates the requirements for the parsing.

A better method to get this workng would be to use an action sequence element that gets the current time using date.timeNow() or the utility data port instead of what is being tried above.

Here's another typical problem designers face. Say, you need to populate all the records from a Shopping Cart table into a Purchase Details table. The Purchase Details table has a foreign key from the Shopping Cart table. Most designers would normally address this by building a list node of the Shopping Cart item table,  which in turn has a child node that edits the record in the Purchase Detail table. An alternative method designers usually take is to add the nodes separately as an integer sequence and then populate the records using Javascript.
There are two things you need to keep in mind when creating Add or Edit records.
If you want to edit a record, you must submit its primary key. If you don't, zeroCode will assume that you want to add a record, and (since you provided all the non-nullables) go ahead and add it.
Updating hidden fields via JavaScript, to produce edited records, is a very painful and laborious process. This is the reason why storage bindings exist. It is a lot easier to simply provide storage bindings for all the fields to be edited, and let the UDM take care of filling the fields.