Archive for December, 2009

Foreign Keys and Performance

Posted in Database on December 28th, 2009 by msposato – Be the first to comment

I recently had an occasion to research the impact of foreign keys on database performance. My assumption has always been that the benefits of data integrity provided by foreign keys was worth the performance cost. I general I believe this is still a valid assumption. However there are some situations were removing foreign keys or adding a NO CHECK option would make sense. For example, where IUD operations vastly outnumber read operations. In my experience this is rare. Usually joins and selects happen far more frequently. Obviously a profiling tool is necessary to make an informed decision. Also consider the end user’s expectations. Do they automatically expect an IUD operation to take longer than a read operation.

Since foreign keys are strictly for data integrity and not performance, I’ve made the assumption that foreign keys are also indexed. In a nutshell here are the advantages / disadvantages of foreign keys.

Advantages:

  • Referential Integrity – aka no orphaned rows.
  • FKs provide big hints to SQL Server’s query optimizer and to DB statistics, both of which lead to better performance.
  • FKs give structure to the data, literally they are the relations in relational databases. In turn, this allows ORMs and visualization tools to see the structure of the database.

Disadvantages:

  • Consistency must be checked on every insert, update and delete (IUD).
  • The index the index must be updated on IUD
  • Data has to inserted and deleted in a certain order.

Agile: Misconceptions, Definition and Perspective

Posted in Agile, Miscelleanous, Pragmatic Programming, Presentations on December 8th, 2009 by msposato – Be the first to comment

It’s unfortunate, but in my experience, Agile development is closely following the Gartner Hype Cycle. Furthermore, I’d guess that many teams are currently in the “Trough of Disillusionment”, perhaps considering Agile another overused buzzword in an industry full of buzzwords. In this post, I enumerate some common Agile misconceptions and, hopefully, offer a more reasonable perspective.

Agile Misconceptions

A common misconception is that Agile is a software development methodology. It’s a reasonable statement, and the sentiment is accurate. However Agile itself lacks the detail of a methodology. The Scrum methodology is most associated with Agile and seems to align itself with the principles of Agile, frequent, short iterations, collaboration, etc.

In recent experiences I have heard Agile defined as a particular development practice. For example, Agile is working in short iterations or Agile is automated testing. Again, there’s a nugget of truth here, but the answer is incomplete.

Other misguided perceptions are that Agile applies only to the IT department or that Agile is easy or at least easier. Clearly the former ignores Agile’s emphasis on collaboration and interaction.  Concerning the latter, Agile helps remove obstacles to better software, but does not involve less effort. I feel Agile often highlights weaknesses, like poor communication skills, or lack of commitment by the business. And those can be hard to fix.

Defining Agile

At a really abstract level, Agile is a philosophy. But I find it hard to sell a philosophy to management. So I use the definition is that Agile is a set of practices that embody the Agile Manifesto[1].  If you’re trying to sneak Agile into your shop, which I currently am trying to do, describe it a set of practices that follow the concepts of integrate, inspect and adapt. Senior management may especially appreciate the inspect and adapt part. I envision the Agile principles and practices being organized as follows[2]:

1. Individuals and interactions over processes and tools

  • Face to Face Communication
  • Code Reviews
  • Pair Programming
  • Close Proximity
  • Mentoring

2. Working software over comprehensive documentation

  • Test Driven Development
  • Continuous Integration
  • Unit Testing
  • Frequent Releases / Short Iterations

3. Customer collaboration over contract negotiation

  • Daily Meetings
  • Face to Face Communication
  • Close Proximity

4. Responding to change over following a plan

  • Frequent Releases / Short Iterations
  • Continuous Improvement

The figure below is a visualization of the above list.

Visualization of Agile Manifesto and Practices

The ideas of maximizing simplicity and self organizing teams need to fit in somewhere. I just haven’t figured out which principles they best embody.

I suppose any development methodology could be used with Agile, but, for me at least, the Scrum Methodology best compliments Agile.

Agile In Perspective

Agile is a means to an end. That end, of course, is better software. Software that meets the customer’s needs and is reliable, maintainable, secure, etc. The end game is not to be Agile, but to create better software.

When Agile was conceived in 2001, it was in response to rigid, structured methodologies that emphasized documents, specific roles for people, well defined phases, milestones, etc. These methodologies seemed generally inconsistent with how software was actually created, or should be created. Nor did these methodologies embrace change, a reality in most line of business applications.

Eight years after conception, many places would not call themselves Agile. However I would venture to guess that many of those places have adopted Agile practices, for example unit tests, or shorter releases. If Agile isn’t mainstream, many of its practices are.

Most of what I’ve discussed thus far is at the project level. For developers, many Agile practices existed before Agile. Two years prior to signing the Agile Manifesto, Andrew Hunt and David Thomas wrote The Pragmatic Programmer.   Many of the practices they discussed would now be called Agile practices. To find out more about Agile developer practices I would direct you to either The Pragmatic Programmer or Practices of an Agile Developer.


[1] I wish the Communists didn’t have a manifesto. To me, it ruined the word.

[2] The numbered items are from the Agile Manifesto. The bulleted items are practices that support the concept.

Using ValidationGroups in Dynamic Data Prior to .NET 4.0

Posted in .NET, ASP.NET, ASP.NET Dynamic Data, C#, ValidationGroup on December 3rd, 2009 by msposato – Be the first to comment

In ASP.NET webform pages, validation groups create sets of controls that are validated separately from other controls. For example, on the same page, one set of controls could be validated when inserting a new product, while a separate group of controls are validated when searching for a product. More information is available here.

The current (.NET Framework 3.5 SP1) Dynamic Data controls do not have the ValidationGroup property. This is problematic when there are different sets of DynamicValidator and ValidationSummary controls on the same page. For example, controls for managing products and product subcategories might be on the same page and each set of controls would have validation (required fields, date format, etc.). But without the ValidationGroup property, validation errors in one set of controls would show error messages in both ValidationSummary controls.

Starting with the .NET 4.0 Framework, ValidationGroup will be a property of the Dynamic Data controls. However it is possible to use validation groups without the entire 4.0 framework. Here’s how.

First, download and unzip ASP.NET Dynamic Data Preview 4.

Second, from a Dynamic Data web application remove the existing references to System.ComponentModel.DataAnnotations.dll and System.Web.DynamicData.dll. Then add references to the following assemblies, which are in the  DynamicDataPreview4\DynamicDataVNextSamples\CommonFiles directory.

  • Microsoft.Web.Extensions.dll
  • System.ComponentModel.DataAnnotations.dll
  • System.Web.DynamicData.dll

You’ll have to decide if the risk of using preview assemblies is worth the benefit of extra functionality. Personally, I’ve had no problems with the preview assemblies and would use them until I upgraded to the 4.0 framework.

Third, you will need to update the version number of the System.Web.DynamicData assembly in  the web.config file. The version number must match the one being referenced. In the system.web/compilation/assemblies node, change

<add assembly=”System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

to

<add assembly=”System.Web.DynamicData, Version=99.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

And in the system.web/pages/controls node change

<add tagPrefix=”asp” namespace=”System.Web.DynamicData” assembly=”System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

To

<add tagPrefix=”asp” namespace=”System.Web.DynamicData” assembly=”System.Web.DynamicData, Version=99.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

Last, add the ValidationGroup property to the Dynamic Controls. Attached to this post is an example page with two sets of Dynamic Data controls. One set is for products, the other for product subcategories. The DynamicField, CommandField, ValidationSummary and DynamicValidator controls are in their respective ValidationGroup, which as expected eliminates cross validation.

ListDetails.aspx