<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Architecture and Data Blog</title>
    <link>https://sadalage.com/</link>
    <description>Recent content 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/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>Publish data models in CI Pipeline</title>
      <link>https://sadalage.com/post/publish-data-models/</link>
      <pubDate>Sat, 16 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/publish-data-models/</guid>
      <description>&lt;p&gt;Many a times ER models are created by the data team and are not shared outside of the data team generally for the lack of tools licenses, since its not feasible for the entire team to purchase licenses for the ER modelling tools such as &lt;a href=&#34;https://www.erwin.com/products/erwin-data-modeler&#34;&gt;Erwin Data Modeller&lt;/a&gt; or &lt;a href=&#34;https://www.idera.com/products/er-studio/data-architect&#34;&gt;Er Studio&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trusting search results from Google &amp; Others</title>
      <link>https://sadalage.com/post/trusted-search-results/</link>
      <pubDate>Fri, 04 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/trusted-search-results/</guid>
      <description>&lt;p&gt;Search engines have been great to find information on the internet with their ease of use and the ability to find cross linked content with specific keywords.&#xA;This ease of use is being exploited by scammers and imposters.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSL Connection to AWS Aurora</title>
      <link>https://sadalage.com/post/ssl-aws-aurora/</link>
      <pubDate>Mon, 15 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/ssl-aws-aurora/</guid>
      <description>&lt;p&gt;On a recent project we had to connect to AWS Aurora postgres 10.6 version of the database in SSL mode using JDBC and Java 11 JRE. When the Aurora cluster is setup, we can force all connections to use SSL by using the options group settings (&lt;code&gt;forceSSL=true&lt;/code&gt;), establishing secure connection from the application to the database is not as easy as it looks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Static Analysis of PL/SQL code</title>
      <link>https://sadalage.com/post/static-analysis-of-plsql-code/</link>
      <pubDate>Tue, 01 Aug 2017 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/static-analysis-of-plsql-code/</guid>
      <description>&lt;p&gt;In all new development and sometimes during legacy codebase modernization, developers tend to add code quality checks and static analysis of codebase such as style checks, bug finders, cyclomatic complexity checking etc. into the CI/CD pipeline. When we inherit a codebase that has much PL/SQL and there is a desire to put the PL/SQL code base through the same types of code analysis, what options does a developer/dba have?&lt;/p&gt;</description>
    </item>
    <item>
      <title>ID generation with ORM&#39;s Table, Sequence or Identity strategy</title>
      <link>https://sadalage.com/post/id-generation/</link>
      <pubDate>Mon, 12 Jun 2017 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/id-generation/</guid>
      <description>&lt;p&gt;In this blog post, I will discuss ID generation techniques using the Object Relation Mapping frameworks such as Hibernate, Toplink, ActiveRecord, Entity Framework. When using hibernate or any other ORM mapping framework. There is a need to generate primary key values for the &amp;ldquo;id&amp;rdquo; columns. These values can be generated by using IDENTITY, SEQUENCE or TABLE strategies.&#xA;Generating custom values for primary keys or other values is a topic for another blog post.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using liquibase to load data and ignore some columns</title>
      <link>https://sadalage.com/post/using-liquibase-to-load-data-and-ignore-some-columns/</link>
      <pubDate>Mon, 15 May 2017 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/using-liquibase-to-load-data-and-ignore-some-columns/</guid>
      <description>&lt;p&gt;Loading data into tables is needed many times on projects to load test, &lt;a href=&#34;http://www.liquibase.org/&#34;&gt;Liquibase&lt;/a&gt; provides a method to load data into tables with lots of customization.&#xA;In the example shown below, I&amp;rsquo;m loading &lt;a href=&#34;http://federalgovernmentzipcodes.us/&#34;&gt;zip code data&lt;/a&gt; with the following column layout&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;Zipcode&amp;#34;,&amp;#34;ZipCodeType&amp;#34;,&amp;#34;City&amp;#34;,&amp;#34;State&amp;#34;,&amp;#34;LocationType&amp;#34;,&amp;#34;Lat&amp;#34;,&amp;#34;Long&amp;#34;,&amp;#34;Location&amp;#34;,&amp;#34;Decommisioned&amp;#34;,&amp;#34;TaxReturnsFiled&amp;#34;,&amp;#34;EstimatedPopulation&amp;#34;,&amp;#34;TotalWages&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Two factor authentication to authorize credit&#34;</title>
      <link>https://sadalage.com/post/two-factor-authentication-to-authorize-credit/</link>
      <pubDate>Wed, 13 Jul 2016 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/two-factor-authentication-to-authorize-credit/</guid>
      <description>&lt;p&gt;&#xA;  &lt;img src=&#34;https://sadalage.com/img/present-flow.jpg&#34; alt=&#34;Simple flow of credit file usage by Individual Citizens&#34;&gt;&#xA;&#xA;&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>Synonyms as abstraction layer</title>
      <link>https://sadalage.com/post/synonyms-as-abstraction-layer/</link>
      <pubDate>Fri, 15 Apr 2016 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/synonyms-as-abstraction-layer/</guid>
      <description>&lt;p&gt;In many development shops, developers are not allowed to access the database schema directly, and are not allowed to create tables, indexes, views etc, instead are given access via a different schema that allows &lt;em&gt;SELECT&lt;/em&gt;, &lt;em&gt;UPDATE&lt;/em&gt; and &lt;em&gt;DELETE&lt;/em&gt; access on data. The general reason is to avoid developers creating database objects without&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>Using rake and activerecord to generate boilerplate DB Code</title>
      <link>https://sadalage.com/post/using-rake-and-activerecord-to-generate-boilerplate-db-code/</link>
      <pubDate>Mon, 20 Jul 2015 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/using-rake-and-activerecord-to-generate-boilerplate-db-code/</guid>
      <description>&lt;p&gt;IN many projects, there are tables which need default audit 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;, &lt;em&gt;Modified_date&lt;/em&gt; and other columns that need to be updated every time some actions are done against the tables and/or columns. This type of functionality can be implemented using triggers.&lt;/p&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>8 Techniques for testing migration of data from legacy systems</title>
      <link>https://sadalage.com/post/testing-migration-of-data-from-legacy-systems/</link>
      <pubDate>Fri, 23 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/testing-migration-of-data-from-legacy-systems/</guid>
      <description>&lt;p&gt;Many of the projects we end up working on are replacing existing systems with existing data either wholly or in part. In all of the above projects we end up writing data migration or data conversion code to move the data from legacy systems to the new systems. Many stake holders of the project such as business users, project managers, business analysts really care about the data conversion scripts and the quality of the conversion. Since this conversion is business entity related and matters a lot as future business/functionality depends on the data being logically equivalent to the legacy system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrations in NoSQL databases</title>
      <link>https://sadalage.com/post/migrations-in-nosql-databases/</link>
      <pubDate>Tue, 14 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/migrations-in-nosql-databases/</guid>
      <description>&lt;p&gt;In relational database usage the pattern of migrations is well understood and has gained widespread acceptance. Frameworks such as &lt;a href=&#34;http://dbdeploy.com/&#34;&gt;DBDeploy&lt;/a&gt;, &lt;a href=&#34;http://www.dbmaintain.org/overview.html&#34;&gt;DBMaintain&lt;/a&gt;, &lt;a href=&#34;http://blog.mybatis.org/p/products.html&#34;&gt;MyBatis migrations&lt;/a&gt;, &lt;a href=&#34;http://flywaydb.org/&#34;&gt;Flyway&lt;/a&gt;, &lt;a href=&#34;http://www.liquibase.org/&#34;&gt;Liquibase&lt;/a&gt;, &lt;a href=&#34;http://guides.rubyonrails.org/migrations.html&#34;&gt;Active Record Migrations&lt;/a&gt; and many others. These tools allow to migrate the database and maintain the version history of the database in the database.&lt;/p&gt;&#xA;&lt;p&gt;With the rise of &lt;a href=&#34;http://www.thoughtworks.com/insights/blog/nosql-databases-overview&#34;&gt;NoSQL Databases&lt;/a&gt; and their adoption in development teams we are faced with the problem of migrations in NoSQL databases. What are the patterns of data migrations that work in NoSQL databases? as NoSQL databases are schema free and the database does not enforce any schema validation, the schema of the data is in the application and thus allows for different techniques of data migration.&lt;/p&gt;</description>
    </item>
    <item>
      <title>10 node mongodb ReplicaSet on a Single Machine&#34;</title>
      <link>https://sadalage.com/post/node-mongodb-replicaset-on-a-single-machine/</link>
      <pubDate>Mon, 09 Jun 2014 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/node-mongodb-replicaset-on-a-single-machine/</guid>
      <description>&lt;p&gt;While doing evalauation of NoSQL databases, we had a&#xA;&lt;a href=&#34;http://sadalage.com/blog/2013/04/25/10_node_riak_cluster/&#34;&gt;10 node riak cluster&lt;/a&gt; and wanted check how a similar setup would work with mongodb. So started to setup a 10 node &lt;a href=&#34;http://www.mongodb.org/&#34;&gt;mongodb&lt;/a&gt; cluster. Since this was for initial spikes, we decided to set this up on a single machine as with the other test setup using &lt;a href=&#34;http://basho.com/riak/&#34;&gt;Riak&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Before I explain how we setup 10 node mongodb ReplicaSet, let me talk about replica sets. MongoDB implements replication, providing high availability using &lt;a href=&#34;http://sadalage.com/blog/2010/10/31/replica_sets_in_mongodb/&#34;&gt;replica sets&lt;/a&gt;. In a replica set, there are two or more nodes participating in an asynchronous master-slave replication. The replica-set nodes elect the master node, or primary node, among themselves and when the primary node goes down, the rest of the node elect the new primary node.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moved my blog to octopress</title>
      <link>https://sadalage.com/post/moved-my-blog-to-octopress/</link>
      <pubDate>Fri, 31 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/moved-my-blog-to-octopress/</guid>
      <description>&lt;p&gt;Its been about a month since my blog moved to octopress, wanted to write about my experience. I had been running my &lt;a href=&#34;http://sadalage.com&#34;&gt;blog&lt;/a&gt; for a some time now using &lt;a href=&#34;http://movabletype.org/&#34;&gt;Movable Type&lt;/a&gt; upgrading as and when new versions where released. Over time I realized that upgrading was fraught with errors as lot of steps had to be done manually. Customizing the layout was risky as there was no way to preview your changes and commit only when I was comfortable. With the release of Movable Type 6 there is no longer a free version to download.&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>10 node Riak cluster on a single machine</title>
      <link>https://sadalage.com/post/node_riak_cluster/</link>
      <pubDate>Thu, 25 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/node_riak_cluster/</guid>
      <description>&lt;p&gt;When trying to evaluate NoSQL databases, its usually better to try them out. While trying them out, its better to use them with multiple node configurations instead of running single node. Such as clusters in Riak or Replica-set in mongodb maybe even a sharded setup. On our project we evaluated a 10 node Riak cluster so that we could experiment with N, R and W values and decide which values where optimal for us. In Riak here is what N, R and W mean.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Transactions using Groovy.SQL with Spring annotations and connection pools</title>
      <link>https://sadalage.com/post/transactions_using_groovysql/</link>
      <pubDate>Mon, 14 Jan 2013 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/transactions_using_groovysql/</guid>
      <description>&lt;p&gt;When using Groovy with Spring framework,  interacting with the database can be done using the Groovy.SQL class which provides a easy to use interface. When using Groovy.SQL, if we have a need to do transactions, we have the &lt;strong&gt;.withTransaction&lt;/strong&gt; method that accepts a closure, to which we can pass in code to execute within the transaction.&#xA;In our project since we were using spring already, using annotations to define transactions would be a great. Standard &lt;strong&gt;@Transactional&lt;/strong&gt; annotations with Groovy.SQL will not work, since every place where the Groovy.SQL is used a new connection is acquired from the connection pool causing the database work to span multiple connections, which can result in dead-locks on the database. What we really want is that the database connection be the same across all invocations of Groovy.SQL with-in the same transaction started by the annotated method.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Backup in mongodb replica-set configurations</title>
      <link>https://sadalage.com/post/backup_in_mongodb_replica-sets/</link>
      <pubDate>Thu, 27 Dec 2012 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/backup_in_mongodb_replica-sets/</guid>
      <description>&lt;p&gt;There are multiple ways to take backups of mongodb is different configuraitions, one of the configuration that I have been involved recently is replica-sets. When mongodb is running in &lt;strong&gt;replica-set&lt;/strong&gt; configuration, there is a single &lt;strong&gt;primary&lt;/strong&gt; node and multiple &lt;strong&gt;secondary&lt;/strong&gt; nodes. To take backup of the replica-set we can either do a &lt;em&gt;mongodump&lt;/em&gt; of one of the nodes or shutdown one of the secondary nodes and take file copies, since in a replica-set all nodes have the same data (except arbiter). Lets see how we could deal with &lt;em&gt;mongodump&lt;/em&gt; method of taking backup.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Back to blogging</title>
      <link>https://sadalage.com/post/back_to_blogging/</link>
      <pubDate>Sun, 22 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/back_to_blogging/</guid>
      <description>&lt;p&gt;&#xA;  &lt;img src=&#34;https://sadalage.com/img/nosql.jpg&#34; alt=&#34;NoSql Distilled&#34;&gt;&#xA;&#xA;&#xA;There has been a long pause in my blogging activity. I was trying to finish of my latest writing engagement in regards to NoSQL. Working with &lt;a href=&#34;http://martinfowler.com&#34;&gt;Martin Fowler&lt;/a&gt; on &lt;a href=&#34;http://www.amazon.com/gp/product/0321826620/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321826620&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&#34;&gt;NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence&lt;/a&gt; was really fun. This book will provide a concise text and easy way to understand for everyone the rise of the NoSQL movement and help with what kinds of trade-offs need to be made while working with NoSQL.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MSSQL JDBC Driver behavior&#34;</title>
      <link>https://sadalage.com/post/mssql_jdbc_driver_behavior/</link>
      <pubDate>Sun, 22 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/mssql_jdbc_driver_behavior/</guid>
      <description>&lt;p&gt;My latest project involves talking to MS-SQL Server using the JDBC driver and Java. While doing this we setup the database connection and had a simple SQL to get the &lt;em&gt;first_name&lt;/em&gt; and &lt;em&gt;last_name&lt;/em&gt; for a unique &lt;em&gt;user_id&lt;/em&gt; from the &lt;em&gt;application_user&lt;/em&gt; table in the database.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SELECT first_name,last_name&#xA;FROM application_user&#xA;WHERE user_id = ?&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Given the above SQL, we did not think too much about performance as the &lt;em&gt;user_id&lt;/em&gt; was indexed. The java code as below was used to run the SQL.&lt;/p&gt;</description>
    </item>
    <item>
      <title>With so much pain, why are stored procedures used so much</title>
      <link>https://sadalage.com/post/why_use_stored_procedures/</link>
      <pubDate>Wed, 19 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/why_use_stored_procedures/</guid>
      <description>&lt;p&gt;I keep encountering situations where all the business logic for the applications is in stored procedures and the application layer is just calling the stored procedures to get the work done and return the data. There are many problems with this approach some of them are.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Writing stored procedure code is fraught with danger as there are no modern IDE&amp;rsquo;s that support refactoring, provide code smells like &amp;ldquo;variable not used&amp;rdquo;, &amp;ldquo;variable out of scope&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Replica sets in MongoDB</title>
      <link>https://sadalage.com/post/replica_sets_in_mongodb/</link>
      <pubDate>Sun, 31 Oct 2010 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/replica_sets_in_mongodb/</guid>
      <description>&lt;p&gt;Replica sets is a feature of MongoDB for Automatic Failover, in this setup there is a primary server and the rest are secondary servers. If the primary server goes down, the rest of the secondary servers choose a new primary via an election process, each server can also be assigned number of votes, so that you can decide the next primary based on data-center location, machine properties etc, you can also start mongo database processes that act only as election tie-breakers these are known as arbiters, these arbiters will never have data, but just act as agents that break the tie.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Schema less databases and its ramifications.</title>
      <link>https://sadalage.com/post/schema_less_databases/</link>
      <pubDate>Tue, 12 Oct 2010 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/schema_less_databases/</guid>
      <description>&lt;p&gt;In the No-SQL land schema-less is a power full feature that is advertised a lot, schema-less basically means you don&amp;rsquo;t have to worry about column names and table names in a traditional sense, if you want to change the column name you just start saving the data using the new column name Lets say you have a document database like mongoDB and you have JSON document as shown below.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{&#xA;&amp;#34;_id&amp;#34;:&amp;#34;4bc9157e201f254d204226bf&amp;#34;,&#xA;&amp;#34;FIRST_NAME&amp;#34;:&amp;#34;JOHN&amp;#34;,&#xA;&amp;#34;MIDDLE_NAME&amp;#34;:&amp;#34;D&amp;#34;,&#xA;&amp;#34;LAST_NAME&amp;#34;:&amp;#34;DOE&amp;#34;,&#xA;&amp;#34;CREATED&amp;#34;:&amp;#34;2010-10-12&amp;#34;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You have some corresponding code to read the documents from the database and lets say you lots of data in the database in the order of millions of documents. If you want to change the name of some attributes or columns at this point and the new JSON would look like&lt;/p&gt;</description>
    </item>
    <item>
      <title>Effective use of data for better customer experience.</title>
      <link>https://sadalage.com/post/effective_use_of_data/</link>
      <pubDate>Tue, 31 Aug 2010 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/effective_use_of_data/</guid>
      <description>&lt;p&gt;For more than seven years I have been getting offers for credit cards from Airlines and Banks. One particular bank has been sending me these solicitations for more than seven years. That is 12 mailings per year, more than 72 mailings so far, remember these are physical paper mailings not the electronic kind. I don&amp;rsquo;t like the junk, it hurts the environment and worst of all I think its not good use of the data they have. How hard is it to design a system around the data they have.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Schema design in a document database</title>
      <link>https://sadalage.com/post/schema_design_in_a_document_databases/</link>
      <pubDate>Wed, 28 Apr 2010 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/schema_design_in_a_document_databases/</guid>
      <description>&lt;p&gt;We are using MongoDB on our project, since mongo is document store, schema&#xA;design is somewhat different, when you are using traditional RDBMS data&#xA;stores, one thinks about tables and rows, while using a document database you&#xA;have to think about the schema in a some what different way. Lets say, we want&#xA;to save a customer object, when using a RDBMS we would come up with Customer,&#xA;Address, Phone, Email. They are related to each other as shown below.&#xA;&#xA;  &lt;img src=&#34;https://sadalage.com/img/customer.jpg&#34; alt=&#34;Relational Design&#34;&gt;&#xA;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>My experience with MongoDB</title>
      <link>https://sadalage.com/post/my_experience_with_mongodb/</link>
      <pubDate>Sun, 18 Apr 2010 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/my_experience_with_mongodb/</guid>
      <description>&lt;p&gt;The current project I&amp;rsquo;m on is using MongoDB. MongoDB is a document based database, it stores JSON objects as BSON (Binary JSON objects). MongoDB provides a middle ground between the traditional RDBMS and the NOSql databases out there, it provides for indexes, dynamic queries, replication, map reduce and auto sharding, its open source and can be downloaded &lt;a href=&#34;www.mongodb.org&#34;&gt;Mongodb&lt;/a&gt;, starting up mongodb is pretty easy.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./mongod --dbpath=/user/data/db&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;is all you need, where /user/data/db is the path where you want mongo to create its data files. There are many other options that you can use to customize the mongo instance.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Workshop at Enterprise Data World 2010</title>
      <link>https://sadalage.com/post/workshop_at_enterprise_data_warehouse/</link>
      <pubDate>Fri, 29 Jan 2010 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/workshop_at_enterprise_data_warehouse/</guid>
      <description>&lt;p&gt;Doing a workshop on &lt;a href=&#34;http://edw2010.wilshireconferences.com/sessionPop.cfm?confid=38&amp;amp;proposalid=2204&#34;&gt;Agile Database Development&lt;/a&gt; at &lt;a href=&#34;http://edw2010.wilshireconferences.com/&#34;&gt;Enterprise Data World 2010&lt;/a&gt; at SF. See you there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing in data conversion projects</title>
      <link>https://sadalage.com/post/automated_data_compare_in_migrations/</link>
      <pubDate>Wed, 18 Nov 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/automated_data_compare_in_migrations/</guid>
      <description>&lt;p&gt;When working on projects involving Conversion of data or Migration/Moving of data from a legacy database. The testing effort is enormous and testing takes a lot of time, some test automation can help this effort.&lt;/p&gt;&#xA;&lt;p&gt;Since data is moved/changed from a source database to destination database, we can write sql which should provide results for the types of tests you want to perform, for example: write a sql to give us number of customers, write a sql to give us account balance for a specific account.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ruby OCI 2.0 Array binding</title>
      <link>https://sadalage.com/post/ruby_oci_20_array_binding/</link>
      <pubDate>Thu, 08 Oct 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/ruby_oci_20_array_binding/</guid>
      <description>&lt;p&gt;We have been doing some data moving lately using Ruby and &lt;a href=&#34;http://ruby-oci8.rubyforge.org&#34;&gt;Ruby-OCI&lt;/a&gt;. We started with Ruby OCI 1.0 and did use prepared statements with bind variables (since we are using oracle database and pulling data from an oracle database and pushing data to an oracle database). Later we found this really cool feature in Ruby-OCI8 2.0 where you can bind a whole array and just make one database trip for many database operations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create an Index for all FK Columns in the database</title>
      <link>https://sadalage.com/post/create_an_index_for_all_fk_columns/</link>
      <pubDate>Thu, 03 Sep 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/create_an_index_for_all_fk_columns/</guid>
      <description>&lt;p&gt;Most of the time I have seen database foreign key constraints on tables without indexes on those columns. Lets say the application is trying to delete a row from the CUSTOMER table&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;DELETE FROM CUSTOMER WHERE CUSTOMERID = 1000;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When the database goes about deleting the customerId of 1000, if there are foreign key constraints defined on customerId, then the database is going to try to find if the customerId of 1000 is used in any of those tables. Lets say ORDER table has the customerId column, the database is going to issue&lt;/p&gt;</description>
    </item>
    <item>
      <title>Materialized views and database links in oracle.</title>
      <link>https://sadalage.com/post/materialized_views_and_databases/</link>
      <pubDate>Mon, 10 Aug 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/materialized_views_and_databases/</guid>
      <description>&lt;p&gt;Recently one of my colleague &lt;a href=&#34;http://blog.norrissoftware.com&#34;&gt;Jeff Norris&lt;/a&gt; had a weird error. He was trying to build a materialized view over some tables in his local database and some tables in his remote database using database links the sql to create the view ran fine and provided the results as expected, but when put inside a materialized view statement complained with &lt;strong&gt;ORA-00942&lt;/strong&gt; errors.&lt;/p&gt;&#xA;&lt;p&gt;Lets say the two databases in question are local and remote, so the sql to create the materialized view to load immediately and refresh everyday is&lt;/p&gt;</description>
    </item>
    <item>
      <title>Perfectly good data.. wasted</title>
      <link>https://sadalage.com/post/use_the_data_you_have_already/</link>
      <pubDate>Wed, 05 Aug 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/use_the_data_you_have_already/</guid>
      <description>&lt;p&gt;Okay this is kind of a rant, maybe I&amp;rsquo;m too picky or just that I hate to see perfectly good data not being used.  This is how it goes..&lt;/p&gt;&#xA;&lt;p&gt;I go regularly to this &lt;a href=&#34;http://www.target.com&#34;&gt;store&lt;/a&gt; to get Horizon organic milk for my family, about 60% of the time I see milk I need NOT in stock, okay I can live with that, may be lots of folks are buying organic milk, but not when it happens frequently, especially when the store knows how much milk was ordered (or supplied from the warehouse) and how much milk was sold, the store should be able to figure out that organic milk gets sold out pretty fast, putting my Business Intelligence (BI) hat on, I think the store should be able to predict when they are going to run out of organic milk ( for that matter any product), its especially frustrating when they have all the data they need to get it done.&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>Oracle for the Mac</title>
      <link>https://sadalage.com/post/oracle_for_the_mac/</link>
      <pubDate>Thu, 14 May 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/oracle_for_the_mac/</guid>
      <description>&lt;p&gt;Ever since I moved to the Mac, I had to run some other OS inside a VM so that I could run Oracle and use it, since Oracle was not available for the the Mac. Now that is no longer the case. Oracle 10gR2 (10.2.0.4) is now available for Mac&lt;/p&gt;&#xA;&lt;p&gt;This is especially nice since the Oracle for Mac was the most voted requirement on mix.oracle.com&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>Storing just the time in Oracle</title>
      <link>https://sadalage.com/post/storing_time_in_oracle/</link>
      <pubDate>Thu, 12 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/storing_time_in_oracle/</guid>
      <description>&lt;p&gt;We came across a need to save just the Time in the database, the requirement is to store time of the day, like say the user likes to have Breakfast at 8.15AM and Lunch at 12.32PM etc. Off course oracle does not have a time only data type.  So we ended up using DATE as the data type and just setting the time. for example:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CREATE TABLE FOO (PREFERRED_TIME DATE NULL);&#xA;INSERT INTO FOO (TO_DATE(&amp;#39;11:34&amp;#39;,&amp;#39;HH24:MI&amp;#39;));&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;oracle automatically sets the date to the first day of the current month. so when you do a select from the FOO table the data would be&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>Article about Behavior Driven Database Design is out</title>
      <link>https://sadalage.com/post/article_about_behavior_driven/</link>
      <pubDate>Mon, 22 Dec 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/article_about_behavior_driven/</guid>
      <description>&lt;p&gt;Recently I have been thinking a lot about making specification and behavior expected about the database and the code that interfaces with the databases &lt;strong&gt;executable&lt;/strong&gt;. The Behavior Driven Design has a lot of parallels in the database world.&lt;/p&gt;&#xA;&lt;p&gt;Just finished writing a article about Behavior Driven Design applied to Databases or &lt;a href=&#34;http://www.methodsandtools.com/archive/archive.php?id=78&#34;&gt;Behavior Driven Database Design for Methods and Tools&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hibernate weirdness with property names</title>
      <link>https://sadalage.com/post/hibernate_weirdness_with_properties/</link>
      <pubDate>Fri, 24 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/hibernate_weirdness_with_properties/</guid>
      <description>&lt;p&gt;Consider this Hibernate mapping&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-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Column&lt;/span&gt;(name&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:#ed9d13&#34;&gt;&amp;#34;qReferenceId&amp;#34;&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;public&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;Long&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#447fcf&#34;&gt;getQReferenceId&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;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;qReferenceId;&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;Where &lt;em&gt;qReferenceId&lt;/em&gt; is data provided to our application via a external reference, we do not have a QReference Object or Table for FK references. When trying to query this object using DetachedQuery, this Simple expression was used.&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-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;List&amp;lt;Movie&amp;gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#447fcf&#34;&gt;findByQReferenceId&lt;/span&gt;(Long&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;id)&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;     &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;SimpleExpression&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;matchesId&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;=&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;Property.&lt;span style=&#34;color:#bbb&#34;&gt;forName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;qReferenceId&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#bbb&#34;&gt;eq&lt;/span&gt;(id);&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;DetachedCriteria&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;criteria&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;=&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;DetachedCriteria.&lt;span style=&#34;color:#bbb&#34;&gt;forClass&lt;/span&gt;(Movie.&lt;span style=&#34;color:#bbb&#34;&gt;class&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;criteria&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;=&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;criteria.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(matchesId);&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;List&amp;lt;Movie&amp;gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;movies&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;=&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;(List&amp;lt;Movie&amp;gt;)&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;getHibernateTemplate().&lt;span style=&#34;color:#bbb&#34;&gt;findByCriteria&lt;/span&gt;(criteria);&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;return&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;movies;&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;When running this method, I kept getting errors shown below.&lt;/p&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>Moved to a Mac</title>
      <link>https://sadalage.com/post/moved_to_a_mac/</link>
      <pubDate>Mon, 01 Sep 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/moved_to_a_mac/</guid>
      <description>&lt;p&gt;Couple of weeks back I was given a choice to upgrade my work Laptop to a Mac Book Pro or a Windows Laptop. I choose Mac ( I know everyone is into macs nowadays). The transition was pretty good, with the exception of moving my oracle database from windows to mac, since there is no native installation of oracle on mac I had to use VMWare fusion to install oracle.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create a Index for every Foreign Key constraint created</title>
      <link>https://sadalage.com/post/create_a_index_for_every_foreign_key/</link>
      <pubDate>Tue, 15 Jul 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/create_a_index_for_every_foreign_key/</guid>
      <description>&lt;p&gt;When creating a Foreign Key constraint on the database as shown below&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ALTER TABLE BOOK ADD&#xA;    (CONSTRAINT FK_BOOK_AUTHOR FOREIGN KEY (AUTHORID)&#xA;     REFERENCES AUTHOR)&#xA;/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In the above example we are telling the database to check if the BOOK.AUTHORID is a valid value in the Author.AuthorID. When the Author table is being changed, the database does data verification on the BOOK table using SELECT against the BOOK table for the AUTHORID some thing like this&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>Japanese Version released&#34;</title>
      <link>https://sadalage.com/post/japanese_version_released/</link>
      <pubDate>Wed, 04 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/japanese_version_released/</guid>
      <description>&lt;p&gt;Japanese translation of &lt;a href=&#34;http://databaserefactoring.com&#34;&gt;Refactoring Databases: Evolutionary Database Design&lt;/a&gt;has been released, thanks to Yasuo Honda for the information. The Japanese version can be found &lt;a href=&#34;http://www.pej-hed.jp/washo/1804.html&#34;&gt;here&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tool support for Database Refactoring</title>
      <link>https://sadalage.com/post/tool_support_for_database_refactoring/</link>
      <pubDate>Tue, 20 May 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/tool_support_for_database_refactoring/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m always on the lookout for better tool support to do database refactoring. Just noticed that &lt;a href=&#34;http://www.liquibase.org&#34;&gt;liquibase&lt;/a&gt; has come out with a IntelliJ plugin to support database refactoring.&lt;/p&gt;&#xA;&lt;p&gt;This is really cool and hopefully one of long list of tools that will support &lt;a href=&#34;http://databaserefactoring.com&#34;&gt;database refactoring&lt;/a&gt; in the future. so enjoy&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>Setup and Teardown of database during testing</title>
      <link>https://sadalage.com/post/setup_and_teardown_of_database/</link>
      <pubDate>Thu, 17 Apr 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/setup_and_teardown_of_database/</guid>
      <description>&lt;p&gt;When doing Performance Testing or running Unit/Functional tests on a database, there is a need to periodically get the database to a known state, so that the tests behave in a predictable way and to get rid of all the data created by the tests. Some of the ways to get a clean database are.&lt;/p&gt;&#xA;&lt;p&gt;Using Scripts: Recreate the database using scripts, the same scripts that are used in development environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Podcast on Keeping Gray code Fit</title>
      <link>https://sadalage.com/post/podcast_on_keeping_gray_code_fit/</link>
      <pubDate>Fri, 18 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/podcast_on_keeping_gray_code_fit/</guid>
      <description>&lt;p&gt;Me, Andy, Jeff and Marjorie discuss how to keep a long running project fit in this &lt;a href=&#34;http://www.thoughtworks.com/what-we-say/podcasts.html&#34;&gt;Podcast&lt;/a&gt;,  also on &lt;a href=&#34;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=269759218&#34;&gt;iTunes&lt;/a&gt;. We discuss the management of technology, people, processes and tools on longer and more mature applications. Specific topics such as refactoring, knowledge management, innovation, staffing, production support and others are covered.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Experience using DBDeploy on my project</title>
      <link>https://sadalage.com/post/exprerience_using_dbdeploy_on_project/</link>
      <pubDate>Mon, 14 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/exprerience_using_dbdeploy_on_project/</guid>
      <description>&lt;p&gt;We have been using &lt;a href=&#34;http://DBDeploy.com&#34;&gt;DBDeploy&lt;/a&gt; on my project for more than 6 months now and wanted to show how things are going. First lets talk about set up, we are using dbdeploy in our Java development environment with ANT as our build scripting tool, against a Oracle 10g database.&lt;/p&gt;&#xA;&lt;p&gt;Define the ANT task first&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-XML&#34; data-lang=&#34;XML&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;taskdef&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;dbdeploy&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;classname=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;net.sf.dbdeploy.AntTarget&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;classpath=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;lib/dbdeploy.jar&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we create the main dbinitialize task a ANT task to create you database schema, using the upgrade generated by the dbdeploy file shown below. The thing to note is that dbdeploy generates the upgrade file but does not run it against your database, so we have to make sure we call the generated upgrade file via a sql ANT task.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lessons from Re-Learning</title>
      <link>https://sadalage.com/post/relearning/</link>
      <pubDate>Thu, 27 Dec 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/relearning/</guid>
      <description>&lt;p&gt;I have been working on a project that I had worked in 2005, trying to get a handle on what I had done about 3 years back. Exploring code and the database has been fun, also discovering the data layout and building new set of data for production has been extremely entertaining. What I learnt from this whole experience was this &lt;em&gt;if your code(application or other wise) is not expecting data, this data should not be provided or even considered valid by the database, the database should be designed such that it does not even allow invalid combinations of the data.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cannot make it out to XP Day London</title>
      <link>https://sadalage.com/post/cannot_make_it_out_to_xp_day_london/</link>
      <pubDate>Tue, 13 Nov 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/cannot_make_it_out_to_xp_day_london/</guid>
      <description>&lt;p&gt;After a lot of frustration about my schedule, I have had to come to this conclusion, that I cannot physically make it to &lt;a href=&#34;http://xpday.org/node/98&#34;&gt;London, XP day&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m going to miss it. Nick Ashley is going to take up my spot and I know he will do a great job.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why do Evolutionary Design</title>
      <link>https://sadalage.com/post/why_do_evolutionary_design/</link>
      <pubDate>Mon, 05 Nov 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/why_do_evolutionary_design/</guid>
      <description>&lt;p&gt;Why do Evolutionary Design or Iterative Design or Incremental Design?&#xA;Everyone who has not worked in an evolutionary manner asks this? My answer, if you think the system you designed is &lt;strong&gt;NOT GOING TO CHANGE EVER&lt;/strong&gt; then sure you can do design once and deploy once and you are done, move on to next project. But tell me one project you have been on, that does not have any changes in requirements, changes in technology, changes in look and feel etc after it was deployed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ThoughtWorks at Oracle Open World</title>
      <link>https://sadalage.com/post/thoughtworks_at_oracle_open_world/</link>
      <pubDate>Tue, 30 Oct 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/thoughtworks_at_oracle_open_world/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://thoughtworks.com&#34;&gt;Thoughtworks&lt;/a&gt; is going to be at &lt;a href=&#34;http://www.oracle.com/openworld/2007/index.html&#34;&gt;Oracle Open World&lt;/a&gt;. I&amp;rsquo;m excited about this especially since it will give ThoughtWorks and Me to talk about software practices and how to apply these software practices to the database development world, off course I will talk about my books Refactoring Databases and Continuous Database Integration. ThoughtWorks will have a booth at &lt;em&gt;343 Moscone South&lt;/em&gt; and I will be there on Nov 14.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Frameworks should not constrain your table design</title>
      <link>https://sadalage.com/post/frameworks_should_not_constrain_design/</link>
      <pubDate>Wed, 03 Oct 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/frameworks_should_not_constrain_design/</guid>
      <description>&lt;p&gt;Recently talking to someone about a persistence framework that they are using,&#xA;this framework creates a rows in the database table with just Primary Key value&#xA;and then later on updates the table row with values for other columns. Because&#xA;of this framework, the tables cannot have any NOT-NULL constraints defined.&lt;/p&gt;&#xA;&lt;p&gt;For example, the framework is doing&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;INSERT&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;INTO&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;customer&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;(customerId,&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;name,&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;birthdate)&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;VALUES&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#3677a9&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&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;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;UPDATE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;customer&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;set&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;=&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#39;FOO Name&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;birthdate&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:#ed9d13&#34;&gt;&amp;#39;12/12/1978&amp;#39;&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;WHERE&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;customerId&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:#3677a9&#34;&gt;1&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;You cannot have NON-NULL constraint defined on name or birthdate column, since&#xA;the INSERT statement would blow up, forcing you to change table design&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lesson learnt changing firewall settings</title>
      <link>https://sadalage.com/post/lesson_learnt_firewall/</link>
      <pubDate>Thu, 13 Sep 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/lesson_learnt_firewall/</guid>
      <description>&lt;p&gt;On any machine running network related services, like in my case Oracle Listener and Dispatch Services. Don&amp;rsquo;t rebuild/stop and restart the firewall stuff like iptables.&lt;/p&gt;&#xA;&lt;p&gt;Had to spend a lot of time, figuring out what was going on. So hard lesson learnt don&amp;rsquo;t mess with iptables when you are running oracle listener/dispatcher&lt;/p&gt;</description>
    </item>
    <item>
      <title>When does evolutionary design happen?</title>
      <link>https://sadalage.com/post/when_does_evolutionary_design/</link>
      <pubDate>Tue, 28 Aug 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/when_does_evolutionary_design/</guid>
      <description>&lt;p&gt;A question I get, mostly related to the evolutionary database design and development. When the pair (team) gets a new feature (story) to work on, the team looks at the existing table/database design and sees if the current design is enough to implement the feature they are working on. If the currency database design does support the feature they are trying to implement, then they do not have to change the database at all, they will move on to implement the feature and change the application code as necessary.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Parsing mapping files for usage information</title>
      <link>https://sadalage.com/post/parsing_mapping_files_for_usage_information/</link>
      <pubDate>Thu, 19 Jul 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/parsing_mapping_files_for_usage_information/</guid>
      <description>&lt;p&gt;Currently working on a legacy application, thats been in production for a long time now. I wanted to find out what are the Tables and Columns being used by the application. Since we could see that some table columns where not being used.&#xA;We are using a Object Relational mapping framework on the project, so we decided to write some code that would parse all the mapping files and gives us a list of table names and columns. We used this list to create rows in a table with two columns tablename and columnname. Once the table had this data, we just ran one more SELECT against the metadata of the database and our table which pretty much gave us a list of Table and Columns that we are not using&lt;/p&gt;</description>
    </item>
    <item>
      <title>Long Running Data Migrations during Database Refactorings</title>
      <link>https://sadalage.com/post/long_running_data_migrations/</link>
      <pubDate>Fri, 29 Jun 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/long_running_data_migrations/</guid>
      <description>&lt;p&gt;When you are refactoring large databases, you will have certain tables that have millions of rows, so lets say we are doing the &lt;a href=&#34;http://databaserefactoring.com/MoveColumn.html&#34;&gt;Move Column&lt;/a&gt; refactoring, moving the TaxAmount column from Charge table which has millions of rows to TaxCharge table. Create the TaxAmount column in the TaxCharge table. Then have to move the data from the TaxAmount column in the Charge table to the TaxAmount column you created in the TaxCharge table.&lt;/p&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>XP2007 Tutorial</title>
      <link>https://sadalage.com/post/xp2007_tutorial/</link>
      <pubDate>Fri, 08 Jun 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/xp2007_tutorial/</guid>
      <description>&lt;p&gt;I will presenting about Database Refactoring: Evolutionary Database Design at &lt;a href=&#34;http://xp2007.org&#34;&gt;XP 2007&lt;/a&gt;  here is the &lt;a href=&#34;http://www.xp2007.org/index.php?option=com_wrapper&amp;amp;Itemid=88&#34;&gt;Tutorial schedule&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>ThoughtWorks Master class series in India</title>
      <link>https://sadalage.com/post/thoughtworks_master_class_series_india/</link>
      <pubDate>Tue, 08 May 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/thoughtworks_master_class_series_india/</guid>
      <description>&lt;p&gt;I will be presenting about Evolutionary Database Design and Database Refactoring at &lt;a href=&#34;http://twi.co.in&#34;&gt;ThoughtWorks Master Class Series 2007&lt;/a&gt; at Bangalore on May 19th and Pune on May 26. This will be the first time I will be presenting in India.&lt;/p&gt;&#xA;&lt;p&gt;The Master Class Series is an annual seminar organized by ThoughtWorks India. It focuses on topics which are cutting edge, but the content of the seminars is drawn from real-life experiences on live projects. The presenters are all people with extensive hands-on experience and have delivered successful projects using the concepts they are talking about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Latest eBook is Out&#34;</title>
      <link>https://sadalage.com/post/recipes_for_continuous_database_integration/</link>
      <pubDate>Mon, 23 Apr 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/recipes_for_continuous_database_integration/</guid>
      <description>&lt;p&gt;After finishing the first &lt;a href=&#34;http://databaserefactoring.com&#34;&gt;Refactoring Databases&lt;/a&gt; book. I started on a short ebook project, this book was going to tackle on a very specific technical topic mentioned in the first book. I wanted to write about all the specific scenarios and all the techniques I follow on the various projects.&lt;/p&gt;&#xA;&lt;p&gt;The result of this effort was &lt;a href=&#34;http://www.awprofessional.com/bookstore/product.asp?isbn=032150206X&amp;amp;rl=1&#34;&gt;Recipes for Continuous Database Integration: Evolutionary Database Development&lt;/a&gt;, thanks to &lt;a href=&#34;http://martinfowler.com&#34;&gt;Martin Fowler&lt;/a&gt; for the title. This &lt;a href=&#34;http://www.awprofessional.com/bookstore/product.asp?isbn=032150206X&amp;amp;rl=1&#34;&gt;ebook&lt;/a&gt; laid out in a recipes kind of format provides various ways you can integrate you database into you development cycle and make evolutionary database development a fun thing to work with&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moscow</title>
      <link>https://sadalage.com/post/moscow/</link>
      <pubDate>Wed, 11 Apr 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/moscow/</guid>
      <description>&lt;p&gt;Last week I was at SD Best Practices in Moscow, doing a presentation on &amp;ldquo;Refactoring Databases: Evolutionary Database Design&amp;rdquo;. Moscow seems like a interesting place, loads of huge buildings, squares, fountains and roads. Things some how feel rundown, feels like a player trying to regain his former ability or glory.&lt;/p&gt;&#xA;&lt;p&gt;Opening Keynote by &lt;a href=&#34;http://www.mccarthyshow.com/TheCore/TheCoreCommitments/tabid/1324/Default.aspx&#34;&gt;Jim McCarthy&lt;/a&gt; about how teams should operate was interesting, he proposed 11 principals or protocols as he calls them, to be followed by members in a team so that the team becomes more productive, many of these protocols are about avoiding waste and promoting clear communication channels.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Promoting Thoughtworks</title>
      <link>https://sadalage.com/post/promoting_thoughtworks/</link>
      <pubDate>Tue, 03 Apr 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/promoting_thoughtworks/</guid>
      <description>&lt;p&gt;I have been working at &lt;a href=&#34;http://www.thoughtworks.com&#34;&gt;Thoughtworks&lt;/a&gt; for 8 years now, its a fun place to work. Reason I&amp;rsquo;m blogging about this, ThoughtWorks is hiring in the US, UK, Australia, India, China and Canada. So go ahead send your resume to &lt;a href=&#34;mailto:work@thoughtworks.com&#34;&gt;work@thoughtworks.com&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Winning a award</title>
      <link>https://sadalage.com/post/winning_a_award/</link>
      <pubDate>Tue, 03 Apr 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/winning_a_award/</guid>
      <description>&lt;p&gt;Last week I received the good news. The &lt;a href=&#34;http://databaserefactoring.com&#34;&gt;book&lt;/a&gt; I co-authored with Scott Ambler won the 2007 Jolt Productivity Award in the Technical Books category. I was dumb enough not to attend the awards ceremony and receive the award, anyway when I started on the book project couple of years back I was afraid if the book would do justice to the Martin Fowler signature series, under which this book appears. The Jolt award award and all the comments I have received from many people in the last year, put me at easy, give me the feeling that finally I can relax and not worry about letting down Martin&amp;rsquo;s signature series.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data Quality and Code Quality</title>
      <link>https://sadalage.com/post/data_quality_and_code_quality/</link>
      <pubDate>Thu, 15 Feb 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/data_quality_and_code_quality/</guid>
      <description>&lt;p&gt;Recently we had peculiar problem. Some of the data in the database was not being created in a proper fashion. Once we found that out we fixed the problem in the application. The customer still had the perception that the code is still broken, because the fixed code was now interacting with the data that was broken (since it was created much earlier by code that was broken). Data has a life of its own (more on this later)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nulls need special love</title>
      <link>https://sadalage.com/post/nulls_need_special_love/</link>
      <pubDate>Thu, 15 Feb 2007 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/nulls_need_special_love/</guid>
      <description>&lt;p&gt;The following SELECT statement in code&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-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stmt&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;=&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;DB.&lt;span style=&#34;color:#bbb&#34;&gt;prepare&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;select id,name,state,zip &amp;#34;&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;        &lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;from customer &amp;#34;&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;        &lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;where &amp;#34;&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;        &lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;phone = ? &amp;#34;&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;        &lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;and active = ?&amp;#34;&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;stmt.&lt;span style=&#34;color:#bbb&#34;&gt;setString&lt;/span&gt;(1,&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;customerPhone);&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;stmt.&lt;span style=&#34;color:#bbb&#34;&gt;setBoolean&lt;/span&gt;(2,&lt;span style=&#34;color:#666&#34;&gt; &lt;/span&gt;isActive);&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;stmt.&lt;span style=&#34;color:#bbb&#34;&gt;execute&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;where &lt;strong&gt;customerPhone&lt;/strong&gt; and &lt;strong&gt;isActive&lt;/strong&gt; are values you would pass in to the SELECT before its executed. Everything is fine when one day the value passed for &lt;strong&gt;customerPhone&lt;/strong&gt; is NULL. For a database (Oracle is what I know most) a NULL will never be equal to NULL , the SELECT will not return rows where the customer.phone is NULL, leading to wrong results. The SELECT will have to be changed to&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing Make Column Non Nullable</title>
      <link>https://sadalage.com/post/implementing_make_column_non_nullable/</link>
      <pubDate>Fri, 15 Dec 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/implementing_make_column_non_nullable/</guid>
      <description>&lt;p&gt;While working on a Legacy Application with Legacy Database design as part of fixing a bug, I thought this bug would not have ever happened if a particular column was defined as &lt;strong&gt;Non Nullable&lt;/strong&gt; since this particular column was the identifier to the parent table.&lt;/p&gt;&#xA;&lt;p&gt;We had a Customer table and the all the names a customer could have like LegalName, LongName, ShortName etc are stored in the CustomerName table. CustomerName cannot exist without Customer hence its logical that the CustomerName.CustomerID column cannot be nullable and should also have a Foreign Key constraint enforcing the relationship. Implementing just the Foreign Key constraint is not enough since the application could potentially be inserting null values in the CustomerName.CustomerID creating orphan records.&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>Kids teaching International Relations&#34;</title>
      <link>https://sadalage.com/post/kids_teaching_international_relations/</link>
      <pubDate>Tue, 26 Sep 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/kids_teaching_international_relations/</guid>
      <description>&lt;p&gt;You learn a lot from kids, and this lesson I will never forget.&lt;/p&gt;&#xA;&lt;p&gt;So I&amp;rsquo;m at Lyon (in France) airport and there are a couple of kids (4-5 year olds) playing in the airport play area which had slides, call these two kids TA and TB my daughter call her AA joins these kids and they all start playing with the slide.&lt;/p&gt;&#xA;&lt;p&gt;All is going well when a family with two kids, mom, dad and grandma join in, mom and dad are staying away and grandma takes the kids lets call them FA and FB to play on the slides. Grandma makes the previous kids (AA, AB, AA)  stop playing and clears the slide for her grand kids (EA and EB) to play the slide. Grandkids start playing for a while and TA and TB are just waiting around not knowing what to do. AA by now has moved on to a different toy in the airport.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Database Migration Utility</title>
      <link>https://sadalage.com/post/database_migration_utility/</link>
      <pubDate>Mon, 28 Aug 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/database_migration_utility/</guid>
      <description>&lt;p&gt;I have taken up the hobby of searching the opensource landscape for tools that help me do Agile database development. I&amp;rsquo;m going to write about all the Tools that I come across that help me, my preference is opensource software but not limited to it. I will try to provide some sound examples and share my experiences with all that tools that I come across and share the example code I used.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inactivity&#34;</title>
      <link>https://sadalage.com/post/inactivity/</link>
      <pubDate>Wed, 26 Jul 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/inactivity/</guid>
      <description>&lt;p&gt;I had been on vacation for sometime. Started back work and getting connected with work and life again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Database Testing</title>
      <link>https://sadalage.com/post/database_testing/</link>
      <pubDate>Tue, 23 May 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/database_testing/</guid>
      <description>&lt;p&gt;What does it mean to test your Database? usually when someone mentions database testing, what is that they want to test. The application code that interacts with the database, or the sql code the resides in the database like stored procedures and triggers etc. I see all these aspects to database testing as important.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Testing the applications persistence mechanism&lt;/em&gt; We should test that the application persists what its supposed to save and retrieve the data using SQL and see if the database contains the same information that is being saved, this kind of testing makes sense when the application has complex persistence layer. This type of testing can be achieved using unit tests, functional tests etc.&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>Automated Tablespace deployment</title>
      <link>https://sadalage.com/post/automated_tablespace_deployment/</link>
      <pubDate>Mon, 01 May 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/automated_tablespace_deployment/</guid>
      <description>&lt;p&gt;In development mode you don&amp;rsquo;t want to worry about which table goes into what Tablespace in production as it complicates development environments. The production DBA&amp;rsquo;s want to have their input and control over deciding what table goes into what Tablespace. To allow for this I used a mapping scheme as shown below.&lt;/p&gt;&#xA;&lt;p&gt;Lets assume we have 3 tables in our system Customer, CustomerOrder, OrderStatus. Where we are expecting Customer table to have large numbers of rows and CustomerOrder to have significanly large number of rows while OrderStatus would have few rows and not change as much. In development environments all these tables and their indexes will be put under the same tablespace. In production like environments we want to put them into seperate tablespaces.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The day I received my Boo</title>
      <link>https://sadalage.com/post/database_refactoring_book/</link>
      <pubDate>Sun, 26 Mar 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/database_refactoring_book/</guid>
      <description>&lt;p&gt;This last week I received my copies of the &lt;a href=&#34;http://www.databaserefactoring.com&#34;&gt;book&lt;/a&gt;, for the first time I could touch what I had worked on for almost a year and half now, I could see it flip the pages. When I opened the UPS box and saw the book for the first time it felt great but in a minute or two I was not feeling anything, after some tea and some walking around I took the book in my hands and started flipping the pages this is when the real feeling started to sink in, but still I was not sure of the situation, was not really sure if it was real, after about 2-3 hours when I saw the book and held the book and started reading, I was started feeling the joy the happiness and all the goodness. I think when I see it being read by others then I will feel a lot different, the other day I saw Nick take out the book out of his backpack I was thrilled to see it being read.&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>
    <item>
      <title>Communication</title>
      <link>https://sadalage.com/post/communication/</link>
      <pubDate>Fri, 03 Feb 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/communication/</guid>
      <description>&lt;p&gt;Why is that many a time I say something and the person hears something else.&lt;/p&gt;&#xA;&lt;p&gt;I have been wondering is it me or is it just the way people listen or interpret my words. How can I communicate better, making it easier for myself and cause less of an hassle for myself and all the ones around me.&lt;/p&gt;&#xA;&lt;p&gt;When I get to the bottom of this, it will be one heck of an achievement.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Refactoring Data</title>
      <link>https://sadalage.com/post/refactoring_databases/</link>
      <pubDate>Thu, 19 Jan 2006 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/post/refactoring_databases/</guid>
      <description>&lt;p&gt;Many a times &lt;a href=&#34;http://refactoring.com&#34;&gt;Refactoring&lt;/a&gt; is talked about in the context of code, recently I finished working with Scott Ambler on &lt;a href=&#34;http://www.databaserefactoring.com&#34;&gt;Database Refactoring&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Lately I have been working on changing data in an production database, and have been wondering how do I define it, Data Refactoring? what are the patterns of Data Refactoring. First let me talk about what I mean by Data Refactoring.&lt;/p&gt;&#xA;&lt;p&gt;When a given application goes into production, and starts life as a live application we find bugs with the application, these bugs create a weird data in the database, also with the way people change data through the app and some times through the database (yikes) and these data changes do lead to bad data.  How do you go about fixing these data problems, are there patterns to these fixes.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://sadalage.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/about/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Pramod Sadalage&lt;/strong&gt; is Director at ThoughtWorks leading the Modern Data Architecture service for North America, he enjoys the rare role of bridging the divide between database professionals and application developers. He is usually sent in to clients with particularly challenging data needs, which require new technologies and techniques. In the early 00&amp;rsquo;s he developed techniques to allow relational databases to be designed in an evolutionary manner based on version-controlled schema migrations.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://sadalage.com/books/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/books/</guid>
      <description>&lt;h2 id=&#34;software-architecture-the-hard-parts-modern-trade-off-analyses-for-distributed-architectures&#34;&gt;Software Architecture: The Hard Parts: Modern Trade-Off Analyses for Distributed Architectures&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;by Neal Ford, Mark Richards, Pramod Sadalage &amp;amp; Zamak Dehghani&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;  &lt;img src=&#34;https://sadalage.com/img/hard-parts-book-cover.jpeg&#34; alt=&#34;Software Architecture: The Hard Parts: Modern Trade-Off Analyses for Distributed Architectures&#34;&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;All software architecture involves trade offs. But traditional analysis tools don’t work well for today’s distributed systems.&lt;/p&gt;&#xA;&lt;p&gt;This book provides techniques to help you discover and weigh the trade-offs as you confront the issues you face as an architect. It investigates why architecture is so difficult and provides proven mechanisms to address these complex problems and make them understandable. Co-authors Neal Ford, Mark Richards, Pramod Sadalage, and Zhamak Dehghani examine everything from how to determine service granularity, manage workflows and orchestration, manage and decouple contracts, and manage distributed transactions to how to optimize operational characteristics, such as scalability, elasticity, and performance.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://sadalage.com/reading/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/reading/</guid>
      <description>&lt;h3 id=&#34;books-i-have-read-recently-and-enjoyed&#34;&gt;Books I have read recently and enjoyed.&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/1492047848/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1492047848&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&amp;amp;linkId=88e13fa7cef80bcadbb697a47aa5cf71&#34;&gt;Monolith to Microservices: Evolutionary Patterns to Transform Your Monolith&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/1491986360/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1491986360&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&amp;amp;linkId=9a6d7f12d623d772192c229b9a46c36c&#34;&gt;Building Evolutionary Architectures: Support Constant Change&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/0735214484/ref=as_li_qf_asin_il_tl?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;creative=9325&amp;amp;linkCode=as2&amp;amp;creativeASIN=0735214484&amp;amp;linkId=8385b125dbc459d14e2c6c6ec82695de&#34;&gt;Range: Why Generalists Triumph in a Specialized World&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1449368425/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1449368425&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&amp;amp;linkId=74UJF6ZTGCERXCQX&#34;&gt;Lean Enterprise: How High Performance Organizations Innovate at Scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/1491950358/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1491950358&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&amp;amp;linkId=a9511c0a7deee4350023801c4ee0ce04&#34;&gt;Building Microservices: Designing Fine-Grained Systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1449368425/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1449368425&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&amp;amp;linkId=74UJF6ZTGCERXCQX&#34;&gt;Lean Enterprise: How High Performance Organizations Innovate at Scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0374533555/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0374533555&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&amp;amp;linkId=SS7Q6TT5EMDMNHX2&#34;&gt;Thinking, Fast and Slow&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/052595418X/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=052595418X&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&amp;amp;linkId=WOWJF2A6M47XVUCC&#34;&gt;The Organized Mind: Thinking Straight in the Age of Information Overload&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1449356265/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1449356265&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&#34;&gt;Graph Databases&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/032150481X/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=032150481X&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&#34;&gt;Agile Analytics: A Value-Driven Approach to Business Intelligence and Data Warehousing (Agile Software Development Series)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1118249747/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1118249747&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&#34;&gt;Jugaad Innovation: Think Frugal, Be Flexible, Generate Breakthrough Growth&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0307887898/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0307887898&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20&#34;&gt;The Lean Startup: How Today&amp;rsquo;s Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0385528752?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0385528752&#34;&gt;Switch: How to Change Things When Change Is Hard&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1577314808?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1577314808&#34;&gt;The Power of Now&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0452289963?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0452289963&#34;&gt;A New Earth&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1934356557?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1934356557&#34;&gt;SQL Anti patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0307465357?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0307465357&#34;&gt;The 4-Hour Workweek&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0768427398?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0768427398&#34;&gt;Loving Our Kids On Purpose&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/076790592X?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=076790592X&#34;&gt;Tuesdays with Morrie&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1582701709?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1582701709&#34;&gt;The Secret&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0321525655?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321525655&#34;&gt;Presentation Zen&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1934356085?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1934356085&#34;&gt;Programming Ruby 1.9&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0978739213?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0978739213&#34;&gt;Release It!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0071392319?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0071392319&#34;&gt;The Toyota Way&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0595471676?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0595471676&#34;&gt;Agile Data Warehousing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0316017922?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0316017922&#34;&gt;Outliers: The Story of Success&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0060958588?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0060958588&#34;&gt;India After Gandhi&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/093263334X?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=093263334X&#34;&gt;Why Does Software Cost So Much? &lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/8129111373?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=8129111373&#34;&gt;It Happened in India&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0974448621?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0974448621&#34;&gt;Oracle Tuning: The Definitive Reference&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0974514047?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0974514047&#34;&gt;Ship it!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/search?ie=UTF8&amp;amp;keywords=978-0131858589&amp;amp;tag=passionaboutd-20&amp;amp;index=books&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Service-Oriented Architecture&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/search?ie=UTF8&amp;amp;keywords=978-0976694014&amp;amp;tag=passionaboutd-20&amp;amp;index=books&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;My Job Went to India&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/search?ie=UTF8&amp;amp;keywords=978-1594200724&amp;amp;tag=passionaboutd-20&amp;amp;index=books&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Let My People Go Surfing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/097451408X?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=097451408X&#34;&gt;Practices of an Agile Developer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0977616606?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0977616606&#34;&gt;Rails Recipes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0974514055?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0974514055&#34;&gt;Programming Ruby&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0596008945?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596008945&#34;&gt;The Art of SQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0609610570?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0609610570&#34;&gt;Execution: The Discipline of Getting Things Done&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0062515675?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0062515675&#34;&gt;The Monk Who Sold His Ferrari&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0061229881?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0061229881&#34;&gt;The Greatness Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/1401900127?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1401900127&#34;&gt;Who Will Cry When You Die?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0060589469?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0060589469&#34;&gt;Zen and the Art of Motorcycle Maintenance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0061234001?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0061234001&#34;&gt;Freakonomics&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0596007124?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596007124&#34;&gt;Head First Design Patterns (Head First)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0471202835?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471202835&#34;&gt;Agile Database Techniques&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/193239415X?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=193239415X&#34;&gt;Hibernate in Action (In Action series)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0374292795?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0374292795&#34;&gt;The World Is Flat&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0393061310?ie=UTF8&amp;amp;tag=passionaboutd-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0393061310&#34;&gt;Guns, Germs, and Steel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://sadalage.com/search/placeholder/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/search/placeholder/</guid>
      <description></description>
    </item>
    <item>
      <title></title>
      <link>https://sadalage.com/talks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/talks/</guid>
      <description>&lt;p&gt;Over the many years I have given many talks at conferences, here are some selected talks available freely.&lt;/p&gt;&#xA;&lt;h3 id=&#34;devops-practices-for-the-database-team&#34;&gt;DevOps Practices for the Database Team&lt;/h3&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/bsFe5cfM8TY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;nosql-distilled---polyglot-persistence-øredev-2014&#34;&gt;NoSQL Distilled - Polyglot Persistence Øredev 2014&lt;/h3&gt;&#xA;&#xA;      &lt;div&#xA;          style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;        &lt;iframe&#xA;          src=&#34;https://player.vimeo.com/video/111285813?dnt=0&#34;&#xA;            style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allow=&#34;fullscreen&#34;&gt;&#xA;        &lt;/iframe&gt;&#xA;      &lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;enabling-continous-delivery-practices-in-databases---øredev-2014&#34;&gt;Enabling Continous Delivery Practices in Databases - Øredev 2014&lt;/h3&gt;&#xA;&#xA;      &lt;div&#xA;          style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;        &lt;iframe&#xA;          src=&#34;https://player.vimeo.com/video/111623115?dnt=0&#34;&#xA;            style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allow=&#34;fullscreen&#34;&gt;&#xA;        &lt;/iframe&gt;&#xA;      &lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;nosql-distilled---goto-geeknight---hamburg&#34;&gt;NoSQL Distilled - GOTO GeekNight - Hamburg&lt;/h3&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/l68zxgZS_wc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;practices-for-agile-database-development---agile-india-2012&#34;&gt;Practices for Agile Database Development - Agile India 2012&lt;/h3&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/00svPVgEKsY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;links-to-video&#34;&gt;Links to video&lt;/h2&gt;&#xA;&lt;h3 id=&#34;infoq-evolving-database-design-and-architecture-patterns-and-practices&#34;&gt;&lt;a href=&#34;http://www.infoq.com/presentations/Evolving-Database-Design-and-Architecture-Patterns-and-Practices&#34;&gt;InfoQ: Evolving Database Design and Architecture: Patterns and Practices&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;h3 id=&#34;infoq-refactoring-databases-evolutionary-database-design&#34;&gt;&lt;a href=&#34;http://www.infoq.com/presentations/refactoring-databases&#34;&gt;InfoQ: Refactoring Databases: Evolutionary Database Design&lt;/a&gt;&lt;/h3&gt;</description>
    </item>
    <item>
      <title>Posts Archive</title>
      <link>https://sadalage.com/archive/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sadalage.com/archive/</guid>
      <description></description>
    </item>
  </channel>
</rss>
