# Ignition Best Practices

**URL:** <https://forum.inductiveautomation.com/t/ignition-best-practices/53078>\
**Category:** Ignition\
**Created:** [November 15, 2021, 3:08pm UTC](https://forum.inductiveautomation.com/t/ignition-best-practices/53078 "2021-11-15T15:08:38Z")\
**Posts on this page:** 1\
**Showing post:** 4

<div class="post-metadata">

**Author:** ![bkarabinchak.psi](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bkarabinchak.psi/32/83567_2.png) [@bkarabinchak.psi](https://forum.inductiveautomation.com/u/bkarabinchak.psi)\
**Post date:** [November 15, 2021, 4:28pm UTC](https://forum.inductiveautomation.com/t/ignition-best-practices/53078/4 "2021-11-15T16:28:11Z")

</div>

In addition to everything @paul-griffith just said which I endorse (especially avoiding the magic pushbutton which in my experience is the biggest obstacle to making a project easily maintainable/expandable) and covers scripting concerns, the other biggest item that can make a project nice and easy or a nightmare to maintain is database design.

Learn how to design normalized databases with proper foreign key/uniqueness constraints, with proper security roles, and putting all your data concerns as NamedQueries which will help you create single sources of truth for datasets. In addition, know how to interact with a database via scripting the right way especially regarding UNIQUNESS as I outline here - [Insert into database only if the entry doesn't exist - #2 by bkarabinchak.psi](https://forum.inductiveautomation.com/t/insert-into-database-only-if-the-entry-doesnt-exist/35122/2)

Unrelated but avoid using `runScript` in expressions if the script you are calling involves round trip communication to the gateway as it can cause problems.

---

_[View the full topic](https://forum.inductiveautomation.com/t/ignition-best-practices/53078)._
