<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Practices on Architecture and Data Blog</title>
    <link>https://sadalage.com/tags/practices/</link>
    <description>Recent content in Practices on Architecture and Data Blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 23 Sep 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sadalage.com/tags/practices/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Automated testing of custom sql</title>
      <link>https://sadalage.com/post/automated_custom_sql_testing/</link>
      <pubDate>Tue, 23 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/automated_custom_sql_testing/</guid>
      <description>&lt;p&gt;Lots of time hand coded SQL is written in the applications for performance sake, getting data using complex SQL out of the tables. As the database structure changes it becomes really hard to find out all the SQL that needs to be changed. In other cases SQL is generated based on certain conditions in the code and its hard to find if the generated SQL is valid after database changes are done.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generate boiler plate code</title>
      <link>https://sadalage.com/post/generate_boiler_plate_code/</link>
      <pubDate>Sat, 17 May 2025 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/generate_boiler_plate_code/</guid>
      <description>&lt;p&gt;When accessing the database using stored procedures for basic Create, Read, Update and Delete (CRUD) functions, or when you want to write triggers that capture the before and after values in tables, or when you want to create Plain Old Java Objects (POJO&amp;rsquo;s) that match the database objects, writing these by hand takes a lot of effort and also since the requirements are changing in an agile projects at a frequent rate, there will be design changes to meet the requirement changes, so the triggers, CRUD stored procedures or Data Access Objects (DAO) are going to be out of data, instead of hand coding, its better to generate the code, using the metadata of the database&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data specialists should pair with developers</title>
      <link>https://sadalage.com/post/pair-with-developers/</link>
      <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/pair-with-developers/</guid>
      <description>&lt;p&gt;Traditionally the data-team is used to sitting in their own area and working for many project teams by handling requests either via a ticketing system or vi email. The hand-over of work or throwing of work over the wall creates knowledge silos and inefficiencies.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatically adding columns to Rails migrations</title>
      <link>https://sadalage.com/post/automatically-adding-columns-to-rails-migrations/</link>
      <pubDate>Mon, 25 Apr 2016 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/automatically-adding-columns-to-rails-migrations/</guid>
      <description>&lt;p&gt;Many projects need addition of identical columns to all the tables created by the project. Audit columns are an example of such a requirement. The requirement is to add columns such as &lt;em&gt;created_by&lt;/em&gt;, &lt;em&gt;created_date&lt;/em&gt;, &lt;em&gt;modified_by&lt;/em&gt; and &lt;em&gt;modified_date&lt;/em&gt; to all the tables, these columns store, who created the row, when the row was created,  who modified the row last and when was it modified. &lt;em&gt;created_by&lt;/em&gt; and &lt;em&gt;created_date&lt;/em&gt; are required to be present when the row is inserted and thus are required to be &lt;em&gt;not nullable&lt;/em&gt;. Adding these columns to each and every table is a lot of work for developers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Behavior Driven Database Development</title>
      <link>https://sadalage.com/post/behavior-driven-database-development/</link>
      <pubDate>Sun, 16 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/behavior-driven-database-development/</guid>
      <description>&lt;p&gt;When Behavior Driven Development &lt;a href=&#34;http://dannorth.net/introducing-bdd&#34;&gt;BDD&lt;/a&gt; was introduced, some of the key principles were&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Requirements are behavior,&lt;/li&gt;&#xA;&lt;li&gt;Provides &amp;ldquo;ubiquitous language&amp;rdquo; for analysis,&lt;/li&gt;&#xA;&lt;li&gt;Acceptance criteria should be executable.&lt;/li&gt;&#xA;&lt;li&gt;Design constraints should be made into executable tests.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Database naming conventions in different environments</title>
      <link>https://sadalage.com/post/database-naming-conventions-in-different-environments/</link>
      <pubDate>Wed, 10 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/database-naming-conventions-in-different-environments/</guid>
      <description>&lt;p&gt;In every enterprise and every project we end up having multiple environments, especially the database side of the enterprise tends to stick around for a longer period of time and has much more dependencies or application integration as opposed to application urls etc.&#xA;Given this, how to name the servers, databases and schemas becomes a very important decision, do these names provide for an easy way to use the application and not make it harder or the developers to access the database.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Usage of mixed case database object names is dangerous</title>
      <link>https://sadalage.com/post/mixed_case_database_objects/</link>
      <pubDate>Tue, 06 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/mixed_case_database_objects/</guid>
      <description>&lt;p&gt;Some versions back, Oracle would not allow to create database object names with mixed cases, even if we tried to create them, we could not. In newer versions of Oracle we can create tables, columns, indexes etc using mixed case or lower case, when the names are put inside double quotes. For example&lt;/p&gt;</description>
    </item>
    <item>
      <title>Explicitly rollback when you encounter a deadlock.</title>
      <link>https://sadalage.com/post/explicitly_rollback_when_you_get_deadlock/</link>
      <pubDate>Tue, 26 May 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/explicitly_rollback_when_you_get_deadlock/</guid>
      <description>&lt;p&gt;Dead lock is caused in the database when you have resources (connections) waiting for other connections to release locks on the rows that are needed by the session, resulting in all session being blocked. Oracle automatically detects deadlocks are resolves the deadlock by rolling back the statement  in the transaction that detected the deadlock. Thing to remember is that &lt;strong&gt;last statement is rolled back and not the whole transaction&lt;/strong&gt;, which means that if you had other modifications, those rows are still locked and the application should make sure that it does a explicit rollback on the connection.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In Oracle 11g password is case sensitive</title>
      <link>https://sadalage.com/post/oracle_11g_password_is_case_sensitive/</link>
      <pubDate>Wed, 06 May 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/oracle_11g_password_is_case_sensitive/</guid>
      <description>&lt;p&gt;In Oracle 10g and before we all know that passwords are not case sensitive, so PASSWORD, Password, password would let you in and everything would be okay.&lt;/p&gt;&#xA;&lt;p&gt;If you upgrade to Oracle 11g (I know lot of you are waiting for 11gR2), you will find that passwords are case sensitive. Here is an example of case sensitive passwords.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;c:\Software&amp;gt;sqlplus bddd/bddd@dosa&#xA;SQL*Plus: Release 11.1.0.6.0 - Production on Wed May 6 15:17:43 2009&#xA;Copyright (c) 1982, 2007, Oracle.  All rights reserved.&#xA;Connected to:&#xA;Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production&#xA;With the Partitioning and OLAP options&#xA;BDDD@dosa &amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lets try to connect with a upper case password&lt;/p&gt;</description>
    </item>
    <item>
      <title>Oracle Metadata can be mis-leading</title>
      <link>https://sadalage.com/post/oracle_metadata_can_be_misleading/</link>
      <pubDate>Tue, 31 Mar 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/oracle_metadata_can_be_misleading/</guid>
      <description>&lt;p&gt;Oracle has metadata about all its objects in various tables/views. One such view is the USER_OBJECTS or ALL_OBJECTS, this view has a column named as STATUS which shows you if the given object is VALID or INVALID. The status applies to DB Code (Stored Procedures, Functions, Triggers etc).&lt;/p&gt;&#xA;&lt;p&gt;To find all the INVALID objects in the schema, issue&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;*&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;USER_OBJECTS&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;WHERE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;STATUS=&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#39;INVALID&amp;#39;&lt;/span&gt;;&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One problem with the way oracle maintains this metadata is, changing the underlying table on which the DB Code depends, oracle marks the objects are INVALID even though the underlying table may have changed in such a way, that it does not affect the DB Code at all (like adding a new column, or making a colum nullable). Here is some code which shows you what I mean. Run it through SQLPlus.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Presentation on Database Refactoring</title>
      <link>https://sadalage.com/post/presentation_on_database_refactoing/</link>
      <pubDate>Thu, 26 Mar 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/presentation_on_database_refactoing/</guid>
      <description>&lt;p&gt;My Presentation on Database Refactoring at QCon  was recorded and is live now on infoQ &lt;a href=&#34;http://www.infoq.com/presentations/refactoring-databases&#34;&gt;here&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Considerations when using stored procedures for doing CRUD</title>
      <link>https://sadalage.com/post/considerations_when_using_procedures/</link>
      <pubDate>Tue, 03 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/considerations_when_using_procedures/</guid>
      <description>&lt;p&gt;Some environments like to have access to the database tables routed via stored procedures.&#xA;Instead of using Create/Read/Update/Delete aka CRUD with DML, stored procedures are invoked with the parameters to perform the required operation. I&amp;rsquo;m not arguing about the benefits/pitfalls of this approach, if you have to do stored procedures, here are some things to look at.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Make the stored procedure handle one object/table only and not multiple objects or tables.&lt;/li&gt;&#xA;&lt;li&gt;Do not commit open transactions inside the stored procedures.&lt;/li&gt;&#xA;&lt;li&gt;Do not do business logic in stored procedures.&lt;/li&gt;&#xA;&lt;li&gt;If they are straight CRUD stored procedures, see if you can generate the stored procedure code using some metadata?&lt;/li&gt;&#xA;&lt;li&gt;Make sure creation and execution of the stored procedures is part of your &lt;a href=&#34;http://studios.thoughtworks.com/cruise-continuous-integration&#34;&gt;Continuous Integration&lt;/a&gt; build and developer build.&lt;/li&gt;&#xA;&lt;li&gt;Make sure stored procedures (or the metadata used to generate them) is under Version Control, have seen many problems when the stored procedure version does not match application code version&lt;/li&gt;&#xA;&lt;li&gt;Develop against the production stack database.&lt;/li&gt;&#xA;&lt;li&gt;Make sure exceptions thrown by the database are passed back to the application.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Using Explicit Order By in your SQL Statements</title>
      <link>https://sadalage.com/post/using_explicit_order_by_in_sql/</link>
      <pubDate>Tue, 30 Sep 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/using_explicit_order_by_in_sql/</guid>
      <description>&lt;p&gt;Recently when our test databases where upgraded new version of Oracle, we started noticing that the order in which some drop down lists were being displayed was not correct. It turns out that the SELECT statement we had, did not have a ORDER BY clause and the data was being returned in the ORDER of the creation of rows (in the order of ROWID) when the database was upgraded these ROWID&amp;rsquo;s got changed and hence the ORDER of the data being shown in the drop down lists.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Version Control your work..</title>
      <link>https://sadalage.com/post/version_control_your_work/</link>
      <pubDate>Fri, 06 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/version_control_your_work/</guid>
      <description>&lt;p&gt;So we version control/source control everything on our project.. code/data/artifacts/diagrams etc. yesterday I said why not extend it to my writings to everything I have. So I started this long journey of refactoring my folder layout and making a nice folder structure to hold all the things I have written about have other artifacts in the process of writing and moved them all to subversion, now all my example code and writings are all under version control that gets backed up everyday&amp;hellip;. feels liberating&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a SQL to generate a SQL</title>
      <link>https://sadalage.com/post/writing_a_sql_to_generate_a_sql/</link>
      <pubDate>Tue, 06 May 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/writing_a_sql_to_generate_a_sql/</guid>
      <description>&lt;p&gt;We had a weird requirement on our project recently..&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Find all the Rows in All the tables that do not comply with the Constraints that we have in development but not in QA environments&lt;/p&gt;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Enforcing your assumptions about database functionality</title>
      <link>https://sadalage.com/post/enforcing_your_assumptions/</link>
      <pubDate>Fri, 08 Jun 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/enforcing_your_assumptions/</guid>
      <description>&lt;p&gt;When you are writing xUnit tests you are in certain ways trying to make sure that the test breaks when the code that is being tested changes the assumptions you made when writing the Test and Production code.&lt;/p&gt;&#xA;&lt;p&gt;Similarly if you are relying on the database to throw a error when you put invalid data, then you should write a test around this assumption, so that when someone changes the database to not behave the way you assumed it to behave, the test you wrote will break and it will force the team to think about the change to the database that is being undertaken. If the change is really required, then the team would fix the test else rollback the change being made.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Database Testing revisited</title>
      <link>https://sadalage.com/post/database_testing_revisited/</link>
      <pubDate>Thu, 09 Nov 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/database_testing_revisited/</guid>
      <description>&lt;p&gt;Some time ago I wrote about what it means to do database testing.. more I think about this and having had some strange situations recently I want to add more to the list of things we should be testing.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Persistence Layer&lt;/em&gt; We should persist the objects to the database using the applications persistence layer and retrieve the objects using the same mechanism and test that we get the same object back. If we have a lot of business logic in out persistence layer we may also want to retrieve the object using Direct SQL and test that the correct values got persisted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Move your DBAs to the Project team locations&#34;</title>
      <link>https://sadalage.com/post/move_dba_to_project_team/</link>
      <pubDate>Tue, 23 May 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/move_dba_to_project_team/</guid>
      <description>&lt;p&gt;Many IT organizations I have seen have groups of specialists, typical are UNIX Group, DBA group etc.&lt;/p&gt;&#xA;&lt;p&gt;When a project starts the developers on the project have to meet with all the Groups (I have more experience with the DBA group, so I write with the DBA group in mind) that they need to interact with and explain to the groups their design, the projects operational needs and other requirements, later when development starts they have to email these groups about all the setup that needs to be done and also the day to day changes that are needed. This way of working slows down the productivity of the team and the organization.&lt;/p&gt;</description>
    </item>
    <item>
      <title>To allow NULLs or NOT</title>
      <link>https://sadalage.com/post/to_null_or_not/</link>
      <pubDate>Wed, 08 Feb 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/to_null_or_not/</guid>
      <description>&lt;p&gt;Database designs I have seen tend to &lt;em&gt;not constrain&lt;/em&gt; the data in the database. For example make the &lt;em&gt;Item.ManufacturerID&lt;/em&gt; non-nullable and make it a foreign key to the &lt;em&gt;Manufacturer&lt;/em&gt; table. Similarly &lt;em&gt;Manufacturer.Name&lt;/em&gt; and &lt;em&gt;Item.Rate&lt;/em&gt; as non-nullable columns. In any greenfield application (existing production application is a topic for another post). When you design table(s) lets say you have &lt;em&gt;Item&lt;/em&gt; and &lt;em&gt;Manufacturer&lt;/em&gt; table as shown below&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;Item&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;(ItemID&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#24909d&#34;&gt;NUMBER&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;NOT&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;NULL&lt;/span&gt;,&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;ManufacturerID&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#24909d&#34;&gt;NUMBER&lt;/span&gt;,&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;Name&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;VARCHAR2(&lt;span style=&#34;color:#3677a9&#34;&gt;128&lt;/span&gt;),&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;Rate&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#24909d&#34;&gt;NUMBER&lt;/span&gt;,&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;CONSTRAINT&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;PK_ITEM&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;PRIMARY&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;KEY&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;(ItemID)&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;);&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;Manufacturer&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;(ManufacturerID&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#24909d&#34;&gt;NUMBER&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;NOT&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;NULL&lt;/span&gt;,&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;Name&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;VARCAHR2(&lt;span style=&#34;color:#3677a9&#34;&gt;128&lt;/span&gt;),&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;CONSTRAINT&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;PK_MANUFACTURER&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;PRIMARY&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;KEY&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;(ManufacturerID)&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;);&lt;span style=&#34;color:#666&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For now let&amp;rsquo;s talk about &lt;strong&gt;NOT NULL&lt;/strong&gt; constraint. Many say they don&amp;rsquo;t make columns non-nullable, because they don&amp;rsquo;t know the requirements at design time, or they don&amp;rsquo;t want their tests to create elaborate sets of data, or that the application enforces the constraint then why enforce the constraint on the database?&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
