Thu, 30 May 2002 10:52:55 -0500 (CDT)
This is kind of long, but itís my $0.02 on the XmlDataDocument issue....
I'm going to the ACM SIGMOD / PODS conference next week, and one of the
scheduled presentations is on mechanisms for indexing XML, so what I have to
say might change in a week, but this is what I see as the best way to go right
The most important thing you need to do is create a homomorphism (a 1:1
mapping ) between nodes in a general tree and rows in a relation. Particularly
this means that two indexes are required, one to map an XmlElement instance to
a DataRow instance and one to map a DataRow instance to an XmlElement
instance. Because am XmlDataDocument can be created from a DataSet that does
not contain any DataRelation or Constraint instances, the comparison used in
the "indexes" between the relational view of data and the xml view of data
cannot be based on "column" values because they won't be guaranteed to be
unique. If this were C++ I would say that pointer values could be used as keys
into whatever type of associative container you wanted to use as your index.
However this isn't C++, and C# reference comparison semantics are limited to
ReferenceEquals which is not sufficient for ordering objects (or for hashing
Because DataRow instances can't be ordered based on column values unless an
enforced unique constraint is in place in the DataSet and that won't always be
the case, that means something else needs to be used. I would suggest adding a
private integer value to every DataRow instance that is set to a table-unique
value when a DataRow is inserted into the table. This can be accomplished by
having a private integer in the DataRowCollection used by a DataTable instance
that is incremented via a call to interlocked increment. Many database systems
use such a "private sequence" scheme in the absence of a primary key on a
table. There use of that value, however, is mostly concerned with the query
rewrite optimizer, which we don't need to worry about here.
This unique integer will not suffice for use as a key into an index that is
used to implement a UniqueConstraint, ForeginKeyConstraint, or a DataRelation
instance. These should use collections of instances of the Tuple class I sent
to the group last week, or some similar mechanism, because they are completely
dependant on value semantics.
Quoting Daniel Morgan <firstname.lastname@example.org>:
> Since you are very acquainted with XML in System.Xml, I thought I
> ask you how would class System.Xml.XmlDataDocument in assembly
> System.Data.dll be created?
> Currently, it is only stubbed. XmlDataDocument inherits from
> XmlDocument. It is meant to provide relational data in a XML Document
> and interact with a DataSet.
> Any ideas?
> Mono-list maillist - Monoemail@example.com