<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: The trouble with soft delete</title>
	<atom:link href="http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/feed/" rel="self" type="application/rss+xml" />
	<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/</link>
	<description>Adventures of a young kiwi software developer in London</description>
	<lastBuildDate>Tue, 09 Mar 2010 23:02:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Wesam Alalem</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-12581</link>
		<dc:creator>Wesam Alalem</dc:creator>
		<pubDate>Thu, 04 Feb 2010 15:05:15 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-12581</guid>
		<description>thanks a lot,
Great points mentioned, I&#039;ll keep this as reference.
Good luck,</description>
		<content:encoded><![CDATA[<p>thanks a lot,<br />
Great points mentioned, I&#8217;ll keep this as reference.<br />
Good luck,</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Steven Quick</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11728</link>
		<dc:creator>Steven Quick</dc:creator>
		<pubDate>Wed, 25 Nov 2009 04:01:52 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11728</guid>
		<description>Opps first paragraph above should have read:

From a database level perspective, the database itself can’t enforce that Job ID xyz should not be in both the Expired and the ActiveListing at the same time, not easily like with unique indexes and constraints on a single table.</description>
		<content:encoded><![CDATA[<p>Opps first paragraph above should have read:</p>
<p>From a database level perspective, the database itself can’t enforce that Job ID xyz should not be in both the Expired and the ActiveListing at the same time, not easily like with unique indexes and constraints on a single table.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Steven Quick</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11727</link>
		<dc:creator>Steven Quick</dc:creator>
		<pubDate>Wed, 25 Nov 2009 03:59:19 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11727</guid>
		<description>The probably from a database level perspective it the database can&#039;t enforce that Job ID xyz should never be in both the Expired and the ActiveListing itself easily.

It makes the sub type approach a little scary because you&#039;re totally dependant on your domain/data services always doing the right thing... ie: Always remove the row from the ActiveListing after Inserting the row into the ExpiredListing.</description>
		<content:encoded><![CDATA[<p>The probably from a database level perspective it the database can&#8217;t enforce that Job ID xyz should never be in both the Expired and the ActiveListing itself easily.</p>
<p>It makes the sub type approach a little scary because you&#8217;re totally dependant on your domain/data services always doing the right thing&#8230; ie: Always remove the row from the ActiveListing after Inserting the row into the ExpiredListing.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Think Before Coding</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11711</link>
		<dc:creator>Think Before Coding</dc:creator>
		<pubDate>Mon, 23 Nov 2009 16:02:55 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11711</guid>
		<description>The user usually don&#039;t mean delete the row from the database (as udi is spotting).
Then, depending on the context, there are different technical way to do what the user is requesting.
*If you use a RDBMS* and if the data should not be used anymore in the context, delete the row, otherwise, mark it.

The important thing is that there are usually several contexts and thus models in an application. Don&#039;t try to fit everything in a single model if you have several contexts with different requirements.
In a history reporting context, you&#039;ll add new entries on a OrderCancelled event, in a context that work on current state, you&#039;ll delete it, in a context whose goal is to track that the order has been cancelled on the shipping site, it&#039;s still another story.</description>
		<content:encoded><![CDATA[<p>The user usually don&#8217;t mean delete the row from the database (as udi is spotting).<br />
Then, depending on the context, there are different technical way to do what the user is requesting.<br />
*If you use a RDBMS* and if the data should not be used anymore in the context, delete the row, otherwise, mark it.</p>
<p>The important thing is that there are usually several contexts and thus models in an application. Don&#8217;t try to fit everything in a single model if you have several contexts with different requirements.<br />
In a history reporting context, you&#8217;ll add new entries on a OrderCancelled event, in a context that work on current state, you&#8217;ll delete it, in a context whose goal is to track that the order has been cancelled on the shipping site, it&#8217;s still another story.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reflective Perspective - Chris Alcock &#187; The Morning Brew #482</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11704</link>
		<dc:creator>Reflective Perspective - Chris Alcock &#187; The Morning Brew #482</dc:creator>
		<pubDate>Mon, 23 Nov 2009 11:18:51 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11704</guid>
		<description>[...] The trouble with soft delete - Richard Dingwall talks about the different techniques for implementing Soft Deletes, looking at the use cases, and some software patterns which offer similar capabilities [...]</description>
		<content:encoded><![CDATA[<p>[...] The trouble with soft delete &#8211; Richard Dingwall talks about the different techniques for implementing Soft Deletes, looking at the use cases, and some software patterns which offer similar capabilities [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Richard</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11681</link>
		<dc:creator>Richard</dc:creator>
		<pubDate>Sun, 22 Nov 2009 00:01:07 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11681</guid>
		<description>@ erwin: a queue could be another table, or some other persistence mechanism. You&#039;re right the system should support the business requirement record future-dated information -- I was just suggesting it puts it aside in a special place until that date arrives and the item becomes active.

Likewise with historical data -- keep it, but store it differently to the live stuff.

I&#039;m 23 by the way!</description>
		<content:encoded><![CDATA[<p>@ erwin: a queue could be another table, or some other persistence mechanism. You&#8217;re right the system should support the business requirement record future-dated information &#8212; I was just suggesting it puts it aside in a special place until that date arrives and the item becomes active.</p>
<p>Likewise with historical data &#8212; keep it, but store it differently to the live stuff.</p>
<p>I&#8217;m 23 by the way!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: erwin smout</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11678</link>
		<dc:creator>erwin smout</dc:creator>
		<pubDate>Sat, 21 Nov 2009 23:07:33 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11678</guid>
		<description>Exceptionally good post if you really are what you claim&quot;a young software developer&quot;.

However.

There are two aspects I fundamentally disagree with :

&quot;If a row doesn’t apply yet, put it in a queue until it does.&quot;
&quot;Keeping historical data&quot;

If the USER (I mean, NOT the AUDITOR) of the application has a business requirement to be able to record future-dated information, then there is no way around the fact that you have to build support for that requirement.

If the USER (once again, NOT the AUDITOR) has a business requirement to be able to query historical data, then that historical data has to be considered as &quot;operational data just like any other&quot;, and there is no way around the fact that you have to include support for that requirement in your application.

(True temporal dbms&#039;s would be a great help to do that, but they don&#039;t exist.)</description>
		<content:encoded><![CDATA[<p>Exceptionally good post if you really are what you claim&#8221;a young software developer&#8221;.</p>
<p>However.</p>
<p>There are two aspects I fundamentally disagree with :</p>
<p>&#8220;If a row doesn’t apply yet, put it in a queue until it does.&#8221;<br />
&#8220;Keeping historical data&#8221;</p>
<p>If the USER (I mean, NOT the AUDITOR) of the application has a business requirement to be able to record future-dated information, then there is no way around the fact that you have to build support for that requirement.</p>
<p>If the USER (once again, NOT the AUDITOR) has a business requirement to be able to query historical data, then that historical data has to be considered as &#8220;operational data just like any other&#8221;, and there is no way around the fact that you have to include support for that requirement in your application.</p>
<p>(True temporal dbms&#8217;s would be a great help to do that, but they don&#8217;t exist.)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Waldo Jaquith - links for 2009-11-21</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11676</link>
		<dc:creator>Waldo Jaquith - links for 2009-11-21</dc:creator>
		<pubDate>Sat, 21 Nov 2009 23:02:39 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11676</guid>
		<description>[...] Richard Dingwall: The trouble with soft delete A good argument that having a &quot;deleted&quot; flag in a database is often a bad idea, and frequently nothing more than cargo cult programming. (The latter is true in my case.) (tags: sql database programming) [...]</description>
		<content:encoded><![CDATA[<p>[...] Richard Dingwall: The trouble with soft delete A good argument that having a &quot;deleted&quot; flag in a database is often a bad idea, and frequently nothing more than cargo cult programming. (The latter is true in my case.) (tags: sql database programming) [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mark Harrison</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11674</link>
		<dc:creator>Mark Harrison</dc:creator>
		<pubDate>Sat, 21 Nov 2009 21:22:00 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11674</guid>
		<description>Nice article, and some interesting points to consider.

I have some situations analagous to soft delete, and have created &quot;where status = active&quot; views so people won&#039;t have to remember to do this themselves.</description>
		<content:encoded><![CDATA[<p>Nice article, and some interesting points to consider.</p>
<p>I have some situations analagous to soft delete, and have created &#8220;where status = active&#8221; views so people won&#8217;t have to remember to do this themselves.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Richard</title>
		<link>http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/comment-page-1/#comment-11673</link>
		<dc:creator>Richard</dc:creator>
		<pubDate>Sat, 21 Nov 2009 20:15:28 +0000</pubDate>
		<guid isPermaLink="false">http://richarddingwall.name/?p=1909#comment-11673</guid>
		<description>@ Matthew W: no references, that&#039;s just what I&#039;ve found from experience.

@ Kane: developers should definitely focus on the business scenario. Most of my posts are about DDD - I link to that same article!

@ David: fair point. Fixed.

BTW the class-per-table arrangement in this article is just one proposed solution, and not necessarily the best. Sharding, partitioning, indexed views, temporal databases etc are some other possibilities that might work better but are beyond the scope of this article (and my knowledge) to go in-depth on. Would be great to see some follow ups/benchmarks exploring this.</description>
		<content:encoded><![CDATA[<p>@ Matthew W: no references, that&#8217;s just what I&#8217;ve found from experience.</p>
<p>@ Kane: developers should definitely focus on the business scenario. Most of my posts are about DDD &#8211; I link to that same article!</p>
<p>@ David: fair point. Fixed.</p>
<p>BTW the class-per-table arrangement in this article is just one proposed solution, and not necessarily the best. Sharding, partitioning, indexed views, temporal databases etc are some other possibilities that might work better but are beyond the scope of this article (and my knowledge) to go in-depth on. Would be great to see some follow ups/benchmarks exploring this.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
