Rdb: Ruby-Nachbau der MWC /rdb-Werkzeuge
This commit is contained in:
+129
@@ -0,0 +1,129 @@
|
||||
.TH fd "" "" "/rdb Command"
|
||||
.PC "Test for functional dependency of columns"
|
||||
\fBfd \fIdeterminecolumn dependcolumn \fB< \fItable\fR
|
||||
.PP
|
||||
.II "column^functional dependency"
|
||||
.II "functional dependency^test"
|
||||
.II "test functional dependency"
|
||||
The command
|
||||
.B fd
|
||||
reads
|
||||
.I table
|
||||
and tests whether its
|
||||
.I determinecolumn
|
||||
determines
|
||||
.IR dependcolumn .
|
||||
A column in a table functionally depends upon another column
|
||||
when there is only one value in the second column for each value in
|
||||
the first.
|
||||
This helps you to determine if a table is normalized.
|
||||
(See the section on
|
||||
.BR Normalization ,
|
||||
below, for details on what this means.)
|
||||
.SH Example
|
||||
First let's look at our inventory table:
|
||||
.DM
|
||||
Item Amount Cost Value Description
|
||||
---- ------ ---- ----- --------------
|
||||
1 3 50 150 rubber gloves
|
||||
2 100 5 500 test tubes
|
||||
3 5 80 400 clamps
|
||||
4 23 19 437 plates
|
||||
5 99 24 2376 cleaning cloth
|
||||
6 89 147 13083 bunsen burners
|
||||
7 5 175 875 scales
|
||||
.DE
|
||||
.PP
|
||||
Note that the first column,
|
||||
.B Item,
|
||||
is the key column for the table.
|
||||
It functionally determines all of the other columns.
|
||||
Each value in column
|
||||
.B Item
|
||||
is unique, so each value determines, or is the key,
|
||||
to its row and all of the column values on it.
|
||||
.PP
|
||||
However, column
|
||||
.B Cost
|
||||
does not functionally depend upon
|
||||
.B Amount
|
||||
because there are two `5' values in
|
||||
.B Amount
|
||||
and each has a different value for
|
||||
.B Cost
|
||||
associated with it (on the same row or line).
|
||||
The common sense (technically called the ``semantics'') of the
|
||||
table is that knowing the number of items we have in inventory
|
||||
does not tell us how much they cost.
|
||||
.PP
|
||||
Now let's see if
|
||||
.B fd
|
||||
can find the dependencies.
|
||||
The command
|
||||
.DM
|
||||
fd Item Cost < inventory
|
||||
.DE
|
||||
.PP
|
||||
returns the message
|
||||
.BR true .
|
||||
This is correct, because
|
||||
.B Item
|
||||
is the key column.
|
||||
However, the command
|
||||
.DM
|
||||
fd Amount Cost < inventory
|
||||
.DE
|
||||
.PP
|
||||
returns the message
|
||||
.BR false .
|
||||
This, too, is correct.
|
||||
.SH Normalization
|
||||
A key column should aways functionally determine all
|
||||
of the other columns in the table.
|
||||
But nonkey columns should not depend upon each other.
|
||||
.PP
|
||||
If there are too few data in the table, a
|
||||
pseudo-dependency may be discovered.
|
||||
Be sure your table has lots of data before you test it.
|
||||
.PP
|
||||
To normalize your tables, you must check for functional
|
||||
dependencies.
|
||||
When functional dependency is found with non\-key columns,
|
||||
the columns should be projected and uniqued to form a second table.
|
||||
Then the functionally dependent column, but not the
|
||||
determining column, should be removed from the first table.
|
||||
For example:
|
||||
.DM
|
||||
column column1 column2 < table | uniq > newtable
|
||||
column `sed 1q table | sed s/column2//` < table > tmp
|
||||
mv tmp table
|
||||
.DE
|
||||
.PP
|
||||
In the second table, the column that determines the other column
|
||||
is the key for that table.
|
||||
If you need to recreate the original first table, you can
|
||||
join the two new tables by using the command
|
||||
.BR jointable ,
|
||||
as follows:
|
||||
.DM
|
||||
jointable -j column1 table newtable > oldtable
|
||||
.DE
|
||||
.PP
|
||||
Normalization, or simplification, is an important process.
|
||||
Normalized files are smaller and are easier to maintain.
|
||||
.SH "See Also"
|
||||
.B
|
||||
column,
|
||||
jointable,
|
||||
paste.rdb
|
||||
.R
|
||||
.br
|
||||
COHERENT Lexicon:
|
||||
.B
|
||||
cut,
|
||||
false,
|
||||
mv,
|
||||
paste,
|
||||
sed,
|
||||
true
|
||||
.SO fd
|
||||
Reference in New Issue
Block a user