<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rock Solid &#187; Data</title>
	<atom:link href="http://rocksolid.gibraltarsoftware.com/category/development/data/feed" rel="self" type="application/rss+xml" />
	<link>http://rocksolid.gibraltarsoftware.com</link>
	<description>Notes from the folks behind Gibraltar Software</description>
	<lastBuildDate>Thu, 19 Jan 2012 23:24:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>VistaDB 4.3 Performance Optimization</title>
		<link>http://rocksolid.gibraltarsoftware.com/development/vistadb-4-3-performance-optimization</link>
		<comments>http://rocksolid.gibraltarsoftware.com/development/vistadb-4-3-performance-optimization#comments</comments>
		<pubDate>Wed, 07 Dec 2011 18:40:34 +0000</pubDate>
		<dc:creator>Jay</dc:creator>
				<category><![CDATA[Data]]></category>
		<category><![CDATA[Database Engine]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Product Information]]></category>
		<category><![CDATA[VistaDB]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://rocksolid.gibraltarsoftware.com/?p=1106</guid>
		<description><![CDATA[Our biggest VistaDB update yet provides a significant performance boost in a number of common query scenarios while improving compatibility with SQL Server and broader support for SQL commands.]]></description>
			<content:encoded><![CDATA[<div id="attachment_1114" class="wp-caption alignright" style="width: 144px"><a href="https://www.gibraltarsoftware.com/Support/VistaDB/Embedded/Latest_Version"><img class="size-full wp-image-1114 " title="Download VistaDB 4.3" src="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/VistaDB.png" alt="Download VistaDB 4.3" width="134" height="160" /></a><p class="wp-caption-text">Download VistaDB 4.3</p></div>
<p>We are happy to announce the biggest update to the VistaDB engine since Gibraltar Software took over the product last year. It&#8217;s actually our <a title="Version History" href="https://www.gibraltarsoftware.com/Support/Version_History.aspx" target="_blank">fifth update</a>, though our earlier releases were more limited in scope consisting of a new streamlined licensing system and a number of bug fixes—often providing closer compatibility with SQL Server scripts.</p>
<p>The main focus of VistaDB 4.3 is query performance, particularly with multiple JOINs. We’re pleased to report 2.5x improvements in many cases and discuss below what’s happening inside the VistaDB engine to achieve these results. Let’s start with an overview of how VistaDB produces query results.</p>
<h1>How Does My Query Work?</h1>
<p>VistaDB queries are executed in three general phases:</p>
<ul>
<li><strong>Parse:</strong> The SQL query text is parsed into a tree of objects representing each language element.</li>
<li><strong>Prepare:</strong> The statement/expression tree is recursively processed to identify table and column references and to determine the data types of results.</li>
<li><strong>Execute:</strong> The statement/expression tree is recursively processed to execute statements and provide results in order (returning to the calling application as each row is ready).</li>
</ul>
<p>If there were no optimizations at all, the engine would walk every row of the parent table. And for each of those rows, then walk every row of the first joined table looking for matches to the ON clause. For each of those rows it would then repeat the process for every row of every additional table referenced in the query. Obviously, this would be ridiculously slow when joining multiple tables of any real size, or even when querying a single table with a large number of rows when you don’t actually want most of them.</p>
<p>To be more efficient, VistaDB performs an additional optimization step at the start of the Execute phase. This step recursively walks the WHERE clause and ON clauses and converts the comparison expressions (and special functions such as BETWEEN) into a more efficient representation as constrains in which each constraint specifies a range of values for a particular column based on constants, parameter values, or the value of a column from an earlier table in the parse tree.</p>
<p>In optimizing the parse tree, VistaDB simplifies the execution plan into a series of constrained tables you could imagine as being evaluated left-to-right. Constraints that can’t be resolved are declared <em>non-optimizable</em> and must be handled by testing the WHERE clause. Similarly, target columns for which there isn’t an available index are also non-optimizable and must be tested row-by-row. These optimized conditions are then processed for logical ANDs and ORs to calculate an overall optimized filter for each table.</p>
<h1>Building On What Already Works Well</h1>
<p>VistaDB has always done well with queries in which a range of rows can be retrieved on a single-column index with an identifiable starting and ending value based on the current rows of tables “to the left” of it. For example, if the parent (FROM) table is restricted by a single comparison in the WHERE clause such as: WHERE ParentTable.ColA = @ChosenValue; (with an index on ColA), then the engine doesn’t need to walk every row of ParentTable, it can start with the first row in the index with a value of @ChosenValue for ColA, and walk each row in the index until it passes the last row with a value of @ChosenValue for ColA. If another table is then joined in it doesn’t need to consider any combinations outside of that range on ParentTable; they’re already certain to be excluded by that condition in the WHERE clause.</p>
<h1>Improvements in VistaDB 4.3</h1>
<p>We use VistaDB extensively in our Gibraltar application monitoring system and noticed that VistaDB performance left something to be desired for some of our more complex queries. For example, it is common to use a placeholder ID (perhaps a UNIQUEIDENTIFIER) as a foreign key into a small lookup table which can contain additional information fields universal to that value. In Gibraltar we have tables such as Application_Type and Boot_Mode which provide caption and description labels for display purposes. They can be joined directly into a query about one or more sessions, like so:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT * FROM Session_Details SD
	JOIN Processor_Architecture OSA
		ON OSA.PK_Architecture_Id = SD.FK_OS_Architecture_Id
	JOIN Boot_Mode BM ON BM.PK_Boot_Mode_Id = SD.FK_OS_Boot_Mode_Id
	JOIN Processor_Architecture RA
		ON RA.PK_Architecture_Id = SD.FK_Runtime_Architecture_Id
</pre>
<p>The joined tables are tiny, only 5 or so rows each, so (in theory) this should be very efficient. Each joined table can have its unique matching row directly looked up based on the corresponding column value in the parent table. Perfect, right? But this query was taking several seconds. The base query (SELECT * FROM Session_Details) took less than half a second, and that’s querying the entire table! What we found in VistaDB 4.2 was that as each JOIN was added to this query, the overall query time nearly doubled! Something was clearly less efficient than it should be.</p>
<p><a href="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/VistaDB43Perf.png"><img class="alignright size-full wp-image-1110" title="VistaDB 4.3 vs VistaDB 4.2" src="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/VistaDB43Perf.png" alt="" width="477" height="287" /></a><br />
As we analyzed the engine internals, we found a lot of opportunities to improve performance which we&#8217;ll be implementing over the coming year. As a first step, we decided to focus in VistaDB 4.3 on reducing the overhead for multiple joins and optimize for the most common cases.</p>
<p>We expect that the majority of joins will be on a single equality between a single column from each table with a foreign key relationship between them. Since this should by definition identify a single value (and often a single row), it should be the most efficient filter to narrow down the joined table based on those “to the left”. So the optimization logic will now catch these top-priority conditions early on and bypass the rest of the expensive reduction pass.</p>
<p>And in queries like our example, we integrated column value caching to eliminate the need to search for the same rows over and over again. When a table is joined on a UNIQUE single column index, the table can cache the row in a Dictionary keyed by the column value from the other table, and each time it comes back to that value, it grabs the row from cache instead of searching the index and reading it from disk again.</p>
<p>We also coded our caching to ensure that it doesn’t consume excessive memory when processing large tables. The cache only holds hard references to the most recently accessed rows. By using weak references to less recently used rows they stick around when memory is plentiful but can be garbage-collected if necessary. For more info on on weak references, check out Kendall&#8217;s Code Project article and sample code on <a title="Using weak references to conserve memory" href="http://www.codeproject.com/KB/string/StringReference.aspx" target="_blank">creating a single instance string store</a>.</p>
<p>As shown in the graph above, VistaDB 4.3 is several times faster for many common queries. More importantly, in queries such as above, performance degrades linearly as more tables are joined, rather than exponentially as before.</p>
<h1>Stay Tuned for More to Come</h1>
<p>The query optimizations we&#8217;ve introduced in VistaDB 4.3 are just a start. Subsequent releases will have additional query optimizations as well as other performance improvements such as support for bulk insert and enhanced multi-user scalability. We also will be adding new features such as enhanced support for Entity Framework, enhanced compatibility with SQL Server and improvements to our development tools (Data Builder, Data Migration Wizard, etc).</p>
<p>We&#8217;ll be writing additional blog posts about our adventures taking VistaDB to the next level, so check back often or leave a question/comment below or in our <a title="Visit our support forums for VistaDB and Gibraltar" href="http://community.gibraltarsoftware.com/forums/">support forums</a> &#8211;we&#8217;d love to hear from you!</p>
]]></content:encoded>
			<wfw:commentRss>http://rocksolid.gibraltarsoftware.com/development/vistadb-4-3-performance-optimization/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Give Those Guys a Hand &#8211; How VistaDB Enabled Gibraltar to be Twice as Good</title>
		<link>http://rocksolid.gibraltarsoftware.com/development/logging/how-vistadb-enabled-gibraltar-to-be-twice-as-good</link>
		<comments>http://rocksolid.gibraltarsoftware.com/development/logging/how-vistadb-enabled-gibraltar-to-be-twice-as-good#comments</comments>
		<pubDate>Mon, 22 Jun 2009 19:47:41 +0000</pubDate>
		<dc:creator>Kendall</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Logging]]></category>
		<category><![CDATA[Gibraltar]]></category>
		<category><![CDATA[VistaDB]]></category>

		<guid isPermaLink="false">http://rocksolid.gibraltarsoftware.com/?p=204</guid>
		<description><![CDATA[How we saved a lot of time and were able to add many more features to Gibraltar, our commercial application monitoring and metric product, by incorporating VistaDB as our common database.  ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2flogging%2fhow-vistadb-enabled-gibraltar-to-be-twice-as-good"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2flogging%2fhow-vistadb-enabled-gibraltar-to-be-twice-as-good&#038;bgcolor=FF9900&#038;cfgcolor=FFFFFF&#038;cbgcolor=175d92" border="0" alt="kick it on DotNetKicks.com" /></a><br />
One key requirement of the Gibraltar Agent is to be able to manage the data files it creates on disk to ensure that they can&#8217;t grow out of control.  After looking at a lot of options, we determined that we need a central index to track the locally generated files.  The problem was that it had to be absolutely safe to use from multiple processes without risk.  We had some simple xml-based ideas to solve the problem, but early prototypes were not encouraging.</p>
<p>Fortunately, before we launched into getting more and more aggressive with solving the problem someone on the team stumbled over <a title="VistasDB" href="http://www.vistadb.net" target="_blank">VistaDB</a>, a fully managed database that we could merge into our agent.  We wrote a quick technical prototype and were impressed:  Not only could we safely throw all the data we needed to track into it even in an extended run of our torture test, but we were able to do the evaluation of whether we needed to prune files or not (and what files to prune) within it which made for a fast, clean, maintainable index.</p>
<p>Even with the success of this prototype, we were very reluctant to go down this road.  Our previous generation solution had use MS Jet for a data store, and it had been a source of problems.  We had ported that to SQL Server, and SQL had become a source of problems for some of our clients.  We&#8217;d internalized the lesson that <strong>databases and logging do not mix</strong> if you want an easy to deploy, foolproof system.  We decided to cast a wider net and look at a range of options:</p>
<ul>
<li><strong>SQL Express / SQL Server Embedded: </strong>Microsoft&#8217;s free offerings.  SQL Express was right out because it was a windows service and would make our deployment complicated and huge.  SQL Server Embedded couldn&#8217;t solve our problem because only one process can access the database files at a time.  And oh yeah, it would make our deployment somewhat complicated and large.</li>
<li><strong>Other third parties: </strong> Without getting into an exhaustive list, we decided it really had to be a completely .NET native, managed implementation that we could merge with our assembly because we were only going to ship one assembly for the agent.  Furthermore, it needed to support syntax at least largely similar to SQL Server so we wouldn&#8217; t have to master multiple environments.</li>
</ul>
<div id="attachment_221" class="wp-caption alignnone" style="width: 527px"><img class="size-full wp-image-221 " title="A summary of the sessions run locally to help you recognize patterns over time" src="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/local_sessions_dashboard.png" alt="A Dashboard of sessions run locally" width="517" height="252" /><p class="wp-caption-text">A Dashboard of sessions run locally</p></div>
<p>In the back of our minds was another consideration:  We&#8217;ve always intended to grow Gibraltar into offering a larger version for enterprises with centralized log storage and management for many computers.  It was a lead pipe cinch that this solution was going to use SQL Server, so the closer we could be to that on the client the better off we&#8217;d be.  The more we worked with VistaDB, the more we started to wonder:  <strong>Did we really need SQL Server even for our future larger version</strong>?  Could we perhaps just use VistaDB?  We did more prototyping and came to the conclusion that it could work very well technically.</p>
<p>At this point, we knew we had a winner in VistaDB.  A quick prototype showed that we could easily <strong>target both it and SQL Server with exactly the same code at each level</strong>.  Nothing else could do that:  We could use the same schema, stored procedure code and database access code and switch between SQL Server and VistaDB with none the wiser.</p>
<h1>If I see so far, it&#8217;s because I stand on the shoulders of giants</h1>
<p><img class="alignright size-medium wp-image-222" title="See the number of sessions for each application that contain errors (red) and warnings (Yellow)" src="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/local_severity_by_application-300x206.png" alt="local_severity_by_application" width="300" height="206" />The best was yet to come.  With VistaDB it&#8217;s easy to create a new instance of a database anytime we needed our index data structure.  Opening and closing databases is relatively fast, so we were able to have a common relational database structure available everywhere.  This meant that we could have just one data model everywhere instead of separate ones for data collection and session data management.  Better yet, we could have one set of database access code for both cases, even if we ultimately supported SQL Server.</p>
<p>This opened a lot of opportunities:</p>
<ul>
<li>The same data bound charts and views could be generated against any repository, allowing immediate analysis without having to copy data first into a central store.</li>
<li>Very large repositories could be supported because the index data didn&#8217;t need to be loaded into memory for processing</li>
<li>We were able to redirect the time saved not developing our own XML persistence format and structure into customer value-add features.</li>
<li>We could add a reporting system that would require rich, hierarchal data structures.</li>
</ul>
<p><img class="alignright size-medium wp-image-220" title="The distribution of sessions by their duration, using a custom timescale" src="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/local_session_duration-300x208.png" alt="local_session_duration" width="300" height="208" />In short, if it wasn&#8217;t for VistaDB most of the features in the repository view and the reporting system of Gibraltar would only be available in a future release that used a central server.  In a small way VistaDB did cause us to spend more development time than we would have &#8211; we got so excited about the potential for some of the features that we&#8217;d written off as being too expensive to implement that we held the release until we could get them done.</p>
<p>Now, we could have written our own thing for a lot of these pieces, but it&#8217;d taken a lot more time (particularly since we target .NET 2.0, not 3.5 so no LINQ for us) and there are some parts that we&#8217;d have always been worried about &#8211; namely the fundamentally hard problem of having may processes accessing the same file doing reads and writes.  That&#8217;s just a hard problem to get right period, and it was great to hand it off to someone who worried as deeply about that as we do about logging and metrics.  In the end, it&#8217;s a great example of not reinventing the wheel unless you want to learn a lot about wheels.  We already knew a lot about databases and shared files, enough to know that we didn&#8217;t want to learn any more.  We were much more interested in digging into the areas that added unique value to Gibraltar.</p>
<h1>Beware the gift Trojan horse</h1>
<p>One last concern we had was that adopting anything into our agent would create a <strong>long term obligation for us to support it</strong>.  Customers would expect that multiple agent versions would safely interoperate on the same computer.  Furthermore, because we would use the same format in our Package files used to send session data between computers we&#8217;d be required to support it for <em>years</em>.  We&#8217;d have to get comfortable that this was feasible.  To this end, we needed the solution to either be available completely through source code we had or through a company that we were absolutely sure would support it long term.</p>
<p>A great incentive for long term support is revenue.  People in general and for-profit companies in particular are <strong>motivated most directly by the idea that people will pay them to do something</strong>.   This was another place where we were a bit concerned with using one of the options from Microsoft because they were all free.   Microsoft&#8217;s motivation for creating these products is primarily defensive &#8211; prevent people from using other free options in the hope that they&#8217;d eventually upgrade to one of the nicely expensive server options.  That&#8217;s fine and good if you&#8217;re targeting one of those options and just want a free scale down option, but this was central to our product.</p>
<p>We could have gone open source, but there are a few issues there for us:</p>
<ol>
<li>No open source option even came close to offering what VistaDB did &#8211; namely the ability to support stored procedures compatible with SQL Server.</li>
<li>We&#8217;d then largely be on the hook for our own source code support if the community wasn&#8217;t doing what we needed, and the whole point here was to not have to write something.</li>
<li>We&#8217;d have to very carefully scrutinize the open source license to make sure we didn&#8217;t get GPL&#8217;d into oblivion.</li>
</ol>
<p>Part of our concerns were mitigated by VistaDB offering a source code license, so we could get source code to make our own changes if we had to.  But really, I wasn&#8217;t looking to ever need to write this code, that&#8217;s why I wanted to get someone else&#8217;s solution.  With VistaDB, we found not only a strong community of folks that have built products around it, just like we were, but also a small company owned by a guy that believed fundamentally that folks like us had to succeed with his product for him to stay in business.  His goals tightly aligned with our needs, and that&#8217;s a great precondition for success.  That&#8217;s good, but there&#8217;s another big condition for success:  Was this company focused on listening to its customers?  Would it respond to our concerns?</p>
<p>As is our tradition, we sent an unsolicited block of product feedback to VistaDB.  There were some good things, but we had some concerns as well.  We got a point by point response from Jason Short, the CEO of VistaDB.  Better yet,<strong> we got an invitation to a conference call</strong>.  Now, at this point VistaDB had gotten a total of $300 from us.  We spent over 7 times that on the fancy graphing component we use, and compared to the criticality of it to our system I&#8217;d have spent a lot more to solve the problem we had.   I was impressed by a series of conversations we&#8217;ve had with Jason and his team, and how dedicated they are to doing the right thing in solving the challenges they&#8217;re up to.</p>
<p>When you think about how much money it costs to create software of any sophistication, it&#8217;s great to be able to pull off a piece of your complexity and <strong>hand it to someone who will care more about it than you do</strong>.  We&#8217;re so happy with how much VistaDB added to what we could offer our customers that you&#8217;ll notice in our About Gibraltar page that we&#8217;re proudly <strong>Powered by VistaDB</strong>.</p>
<p style="text-align: center;"><a href="http://www.GibraltarSoftware.com/See"><img class="size-full wp-image-206 aligncenter" title="The Gibraltar About Box" src="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/about_gibraltar.png" alt="about_gibraltar" width="449" height="394" /></a></p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2flogging%2fhow-vistadb-enabled-gibraltar-to-be-twice-as-good"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2flogging%2fhow-vistadb-enabled-gibraltar-to-be-twice-as-good&#038;bgcolor=FF9900&#038;cfgcolor=FFFFFF&#038;cbgcolor=175d92" border="0" alt="kick it on DotNetKicks.com" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://rocksolid.gibraltarsoftware.com/development/logging/how-vistadb-enabled-gibraltar-to-be-twice-as-good/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reporting Driven Data Design</title>
		<link>http://rocksolid.gibraltarsoftware.com/development/reporting-driven-data-design</link>
		<comments>http://rocksolid.gibraltarsoftware.com/development/reporting-driven-data-design#comments</comments>
		<pubDate>Mon, 18 May 2009 00:24:02 +0000</pubDate>
		<dc:creator>Kendall</dc:creator>
				<category><![CDATA[Data]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[reporting]]></category>

		<guid isPermaLink="false">http://rocksolid.gibraltarsoftware.com/?p=50</guid>
		<description><![CDATA[Design the reports you need for your application early on to test your data model.  They'll uncover flaws that you won't get by focusing on the normal usage of the app.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2freporting-driven-data-design"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2freporting-driven-data-design&#038;bgcolor=FF9900&#038;cfgcolor=FFFFFF&#038;cbgcolor=175d92" border="0" alt="kick it on DotNetKicks.com" /></a><br />
We were well along in the development of Gibraltar before we started designing the reporting system and the reports within it.  I&#8217;ve made that mistake before; this time the challenge was we didn&#8217;t originally intend to have a reporting system but customer feedback from our early betas showed that it was going to make a difference.  Having been to this rodeo twice before, we were very careful in selecting the right reporting system to integrate and in designing the integration so we could easily add new reports, new data sources for reports, and customize reports for clients.  It was moving along pretty well until the first internal demonstration of the reporting system.</p>
<p><a href="http://graphjam.com/2008/06/05/song-chart-memes-wake-me-up"><img class="size-full wp-image-143 alignright" title="funny-graphs-wham" src="http://rocksolid.gibraltarsoftware.com/wp-content/uploads/funny-graphs-wham.gif" alt="funny-graphs-wham" width="400" height="283" /></a>During the demo, it became clear once we got beyond the excitement of print-ready documents showing within the application there was a bigger issue:  The data that our customers would really want to have took too long to calculate every time the report ran.  We were going to have to change the data model.  Not only that, but the data we needed wasn&#8217;t readily available; we were going to have to introduce an analysis engine into our architecture to derive the data we needed from what we were actually collecting.</p>
<p>Fortunately, after consulting with our beta customers we determined that we could make some breaking changes in our data format.  Still, it was a lot more expensive than it had to be.  That got us thinking again:  If you really want to be sure your data format has everything it needs, you need to focus not just on the <em>tactical</em> data collection that you interact with every day but the <em>strategic reporting</em> that drives value for the higher end user.</p>
<p>Much of development is focused on tactical requirements:  What has to be on this screen, what data do you need to have for a specific calculation&#8230;  What&#8217;s easy to miss is the strategic level:  If you know all of these things, <strong>what higher level insight can you get</strong>?  Usually you&#8217;ll start down this path and discover there&#8217;s a lot you could do from the data you have, but then some subtle new requirements emerge &#8211; to make things line up you need relationships you aren&#8217;t tracking, or slightly more data in certain areas.</p>
<p>So on your next project, put the reports up front in the design as a practical tool to test the model.  It&#8217;s a good bet that if you can feed the reports everything they need, you&#8217;ve got all the data in your model.  Additionally, your attention to the strategic value you can add for your users may win you a new set of fans higher up the management chain than you would have otherwise.<br />
<a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2freporting-driven-data-design"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2frocksolid.gibraltarsoftware.com%2fdevelopment%2freporting-driven-data-design&#038;bgcolor=FF9900&#038;cfgcolor=FFFFFF&#038;cbgcolor=175d92" border="0" alt="kick it on DotNetKicks.com" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://rocksolid.gibraltarsoftware.com/development/reporting-driven-data-design/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

