Design question

Arthur Clemens aclemens at xs4all.nl
Wed Dec 3 02:52:48 CST 2003


I am encountering a basic design question - and I find it difficult to 
put into words. Let me describe my application in progress:

I am creating a database for a Slovene-Dutch dictionary. I have created 
a hierarchical design for this, that I think works out well, but does 
creates some difficulties.

database tables:
	Record
		child SloveneWord ( n x)
		child FormalDescription (with date fields) (1 x)
			child RecordSection (n x)
				child DutchTranslation (n x)
				... a few more tables (n x)


In the interface (UI), I have a scrollable table of Slovene words - 
clicking on a word shows the full record. The table can be sorted on 
word (ascending and descending) (SloveneWord.text), on translation 
(DutchTranslation.text), and on modification date 
(FormalDescription.modification_date).
When I perform a search, the results set narrows with each letter that 
I type, thereby keeping its sort order.

The basic question is: how do I create a set that I can use to 
accomplish this?
I have several options, but I am not sure what is a good choice design 
wise or performance wise.

1)
Create a FBL_BitSet of Record->SelectAllRecords(), then create an 
FBL_ArraySet out of this.
I cannot just create a set of SloveneWord.RecIDs, as empty entries can 
exist (a Record with nothing filled in for SloveneWord) - these should 
be visible as empty lines in the UI table.
Problem: how to sort Record.RecIDs on the basis of a field in a child 
table?
Possible solution:
For each Record.RecID:
	- Find a SloveneWord where its parent equals the Record.RecID, and its 
sort_order is 0.
	- Of the found SloveneWord, feed its SloveneWord.text to a compare 
function.
I can use the same principle to get FormalDescription.modification_date 
when sorting on date.
Is this super slow? Is there a better way?

2)
Create a FBL_Cursor from a SqlSelect query:
         "SELECT record.RecID, slovene_word.parent, 
slovene_word.sort_order "
         "FROM record, slovene_word "
         "WHERE slovene_word.sort_order = 0"

But this does skip empty SloveneWord (NULL) entries. And I think it is 
not possible to create a set from a cursor.

3)
When sorting on SloveneWord, create a FBL_ArraySet using Sort( 
allMySloveneWordsBitSet, slovene_word.text, ascending == true);
and somehow map it to the BitSet of all Records.
Seems far fetched.

4)
Create an intermediary M::M table: Record_SloveneWord_Table, to keep 
track of each Record and its corresponding SloveneWords children.

Record_SloveneWord_Table:

|	record.RecID		|	slovene_word.RecID	|
-------------------------------------------------
|			1			|			1			|
|			2			|			2			|
|			2			|			3			|
|			3			|			4			|
|			4			|			5			|
|			4			|			6			|
|			4			|			7			|


But to sort this I would still need a sorting function like in 1).


Any help and suggestions are welcome!



Arthur Clemens




More information about the Valentina mailing list