Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
146,55 KB
Nội dung
Chapter T y p e s Principal Sections • • • • • • Values vs variables Types vs representations Type definition Operators Type generators SQL facilities General Remarks This chapter is new in this edition (it's a greatly expanded and completely rewritten version of portions of Chapter from the seventh edition) It opens with this remark: Note: You might want to give this chapter a "once over lightly" reading on a first pass The chapter does logically belong here, but large parts of the material aren't really needed very much prior to Chapter 20 in Part V and Chapters 25-27 in Part VI From a teaching point of view, therefore, you might want to just take types as a given for now and go straight on to Chapter If you do, however, you'll need to come back to this material before covering any of Chapters 20 and 25-27, and you'll need to be prepared for occasional questions prior to that point on the topics you've temporarily skipped As noted in the introduction in this manual to this part of the book, it's this part above all others that I believe distinguishes this book from the competition With respect to this chapter specifically, one feature that sets the book apart from others (including previous editions of this book) is its emphasis on domains as types The chapter goes into considerable detail on what's involved in defining──and, to some extent, implementing──such types (associated operators included) The stated position that a domain and a type are the same thing permeates the entire book from this point forward; in fact, I prefer the term type, and use domain mostly just in contexts where history demands it Copyright (c) 2003 C J Date page 5.1 So we're talking about type theory Type theory is really a programming language topic; however, it's highly relevant to database theory, too (in fact, it provides a basis on which to build such a theory) It might be characterized as the point where "databases meet programming languages." It seems to me that the database community ignored this stuff for far too long, to their cost (to ours too, as users) I could certainly quote some nonsense from the database literature in this connection For example: (Begin quote) Even bizarre requests can easily be stated; for example, SELECT FROM WHERE AND c.customer_name Customer_Table c, Zoo_animal_Table z c.no_of_children = z.no_of_legs c.eye_color = z.eye_color ; This request joins the Customer_Table and Zoo_animal_Table relations based on relationships phrased in terms of no_of_children, no_of_legs, and eye_color The meaning of these relationships is not entirely clear (End quote) This quote is taken from a book on object databases; I'll leave it as an exercise for you to deconstruct it By way of a second example, I could simply point to the mess the SQL standard has made of this whole issue (see Section 5.7 in this chapter, also the "SQL Facilities" sections in Chapters 6, 9, 19, 20, and 26) The approach we advocate (to databases overall), then, is founded on four core concepts: type, value, variable, operator These concepts are NOT novel (I like to say "they're not new and they'll never be old") Of them, type is the most fundamental To see why, consider type INTEGER (this example is taken from the annotation to reference [3.3], The Third Manifesto): • The integer "3" might be a value of that type • N might be a variable of that type, whose value at any given time is some integer value (i.e., some value of that type) • And "+" might be an operator that applies to integer values (i.e., to values of that type) Copyright (c) 2003 C J Date page 5.2 Basic point: Operands for a given operator must be of the right type (give examples) We assume throughout that type checking is done at compile time, wherever possible Points arising: • Types (domains) are not limited to being scalar types only, though people often think they are • We prefer the term operator over the "equivalent" term function One reason for that preference is that all functions are operators, but not all operators are functions For further discussion, see reference [3.3] • Following on from the previous point: Please note that we're not following SQL usage here, which makes a purely syntactic distinction between operator and function To be specific, SQL uses function to mean an operator that's invoked by means of classical functional notation──or an approximation to that notation, at any rate!──and operator to mean one that's invoked using a special prefix or infix notation (as in, e.g., prefix or infix minus) We're not very interested in matters that are primarily syntactic in nature Types can be system-defined (built in) or user-defined Note right up front that "=" and ":=" must be defined for every type You can use this fact to introduce the important notion of overloading (meaning different operators with the same name) Note too that v1 = v2 if and only if v1 and v2 are in fact the very same value (our "=" is really identity) This point is worth repeating whenever it makes sense to so, until the point is crystal clear and second nature to everyone Aside: SQL allows "=" to have user-defined semantics! and possibly not to be defined at all! at least for structured types Note some of the implications: Can't specify "uniqueness" on columns containing such values Can't joins over such columns Can't GROUP BY on such columns And so on Forward reference to Chapter 6: The relational model doesn't prescribe specific types──with one exception, type BOOLEAN (the most fundamental type of all).* In other words, the question as to what data types are supported is orthogonal to the question of support for the relational model as such Many people, and products, are confused over this simple point, typically claiming that "the relational model can support only simple types like numbers and strings." Not so! There's a nice informal jingle that can serve to reinforce this message: Types are orthogonal to tables [3.3] ────────── Copyright (c) 2003 C J Date page 5.3 * Of course, it also prescribes one type generator, RELATION, but a type generator isn't a type ────────── Some text from Chapter 26 to illustrate the foregoing popular misconception: The following quotes are quite typical: "Relational database systems support a small, fixed collection of data types (e.g., integers, dates, strings)" [26.34]; "a relational DBMS can support only its built-in types [basically just numbers, strings, dates, and times]" [25.31]; "object/relational data models [sic] extend the relational data model by providing a richer type system" [16.21]; and so on (To explain that "[sic]": We'll argue in Chapter 26 that there's only one "object/relational model," and that model is in fact the relational model──nothing more and nothing less.) 5.2 Values vs Variables One of the great logical differences (see the preface) We'll be appealing to this particular distinction (between values and variables) many, many times in the chapters to come It's IMPORTANT, and a great aid to clear thinking Every value is of just one type (this becomes "just one most specific type" when we get to inheritance in Chapter 20; declared types are always known at compile time, but "most specific types" might not be) Every variable is of just one type, too, called the declared type Relational attributes, read-only operators, parameters, and expressions in general also all have a declared type Give examples 5.3 Types vs Representations Another of the great logical differences!──and one that SQL in particular gets confused over (Actually SQL gets confused over values vs variables as well.) Carefully explain: • Scalar vs nonscalar types (and values and variables etc.) • Possible representations ("possreps") Copyright (c) 2003 C J Date page 5.4 • Selectors • THE_ operators Regarding scalar types: A scalar type is one that has no user-visible components Note carefully, however, that fairly complicated things can be scalar values! Chapter includes examples in which (e.g.) geometric points and line segments are legitimately regarded as scalar values Make sure the students understand the difference between components of a type per se and components of a possible representation for a type Sometimes we sloppily say things like "the X component of point P," but what we should really be saying is "the X component of a certain possible representation of point P." Regarding possreps: The distinction between physical (or actual) and possible representations is much blurred in the industry (especially in SQL), but it really ought not to be It's crucial to, and permeates, the proposals of reference [3.3] Regarding selectors: Selectors are a generalization of literals And, of course, "everyone knows" what a literal is──or they? Certainly it seems to be hard to find a definition of the concept in the literature (good or bad); in fact, there seems to be some confusion out there (see ODMG, for example) Here's a good definition (from The Third Manifesto): A literal is a symbol that denotes a value that's fixed and determined by the particular symbol in question (and the type of that value is also fixed and determined by the symbol in question) Loosely, we can say that a literal is selfdefining Note: The term selector is nonstandard──it comes from reference [3.3], of course──but there doesn't seem to be a standard term for the concept Don't confuse it with a constructor; a constructor, at least as that term is usually understood, constructs a variable, but a selector selects a value (SQL has its own quirks in this area, however, as we'll see) Regarding THE_ operators: Once again these ideas come from reference [3.3] Note, however, that most commercial products support, not THE_ operators as such, but rather "GET_ and SET_ operators" of some kind (possibly, as in SQL, via dot qualification syntax) The distinction is explained in detail in reference [3.3]; in a nutshell, however, GET_ and THE_ operators are the same thing (just different spellings), but SET_ operators and THE_ pseudovariables are not the same thing (because SET_ operators are typically defined to have a return value) Note Copyright (c) 2003 C J Date page 5.5 that, by definition, THE_ operator invocations appear in source positions──typically the right side of an assignment──while THE_ pseudovariable invocations appear in target positions──typically the left side of an assignment Further explanation: Essentially, a pseudovariable is an operational expression (not just a simple variable reference) that can appear in a target position The term is taken from PL/I SUBSTR provides a PL/I example Note: This section of the book includes the following: "Alternatively, THE_R and THE_θ could be defined directly in terms of the protected operators (details left as an exercise)." Here's an answer to that exercise: OPERATOR THE_R ( P POINT ) RETURNS ( RATIONAL ) ; BEGIN ; VAR X RATIONAL ; VAR Y RATIONAL ; X := X component of physical representation of P ; Y := Y component of physical representation of P ; RETURN ( SQRT ( X ** + Y ** ) ) ; END ; END OPERATOR ; OPERATOR THE_θ ( P POINT ) RETURNS ( RATIONAL ) ; BEGIN ; VAR X RATIONAL ; VAR Y RATIONAL ; X := X component of physical representation of P ; Y := Y component of physical representation of P ; RETURN ( ARCTAN ( Y / X ) ) ; END ; END OPERATOR ; 5.4 Type Definition Distinguish types introduced via the TYPE statement and types obtained by invoking some type generator They're all types, of course, and can all be used wherever a type is needed; however, I note in passing that an analogous remark does not apply to SQL (were you surprised?) This section is concerned with the former case only, and with scalar types only Explain type constraints carefully (forward reference to Chapter 9) Obviously fundamental──but SQL doesn't support them! (Forward reference to Section 5.7.) 5.5 Operators Copyright (c) 2003 C J Date page 5.6 Carefully explain: • Read-only vs update operators • THE_ pseudovariables (if not already covered) • Multiple assignment • Strong typing (if not already covered) Read-only vs Update Operators The distinction between read-only and update operators──another logical difference!──becomes particularly important when we get to inheritance (Chapter 20) Prior to that point, it's mostly common sense You should be aware, however, that the idea that update operators return no value and must be invoked by explicit CALLs isn't universally accepted but is required──for good reasons──by the type model adopted in The Third Manifesto [3.3] A note regarding the REFLECT example: The alert student might notice that REFLECT is in fact a scalar update operator specifically, and might object, correctly, that scalar update operators aren't part of the relational model The discussion of such operators in this chapter might thus be thought a little out of place The point is, however, that such operators are definitely needed as part of the total environment that surrounds any actual implementation of the relational model.* (Also, there really isn't any other sensible place in the book to move the discussion to!) ────────── * In the same kind of way, scalar variables aren't part of the relational model but will surely be available in any environment in which a relational implementation exists For example, a scalar variable will be needed to serve as a receiver for any scalar value that might be retrieved from some tuple in some relation in the database ────────── By the way: If a prescribed ones ("=", more to be defined in wasn't worth defining given type has no operators other than the ":=", selectors, THE_ operators, plus a few subsequent chapters), then the type probably in the first place Copyright (c) 2003 C J Date page 5.7 Multiple Assignment Assignment as such is the only update operator logically required (all other update operators are just shorthand for certain assignments, as we already know in the case of relational assignments specifically) Multiple assignment is somewhat novel and not fully supported in today's products, but we believe it's logically required Basic idea is to allow several individual assignments to be executed (a) without any integrity checking being done until the end and at the same time (b) without the application being able to see any temporarily inconsistent state of the database "in the middle" of those individual assignments A couple of points arising: • As the book says, the semantics are carefully specified to give a well-defined result when distinct individual assignments update distinct parts of the same target variable (an important special case) It's not worth getting into this issue in a live presentation, but here are the rules for purposes of reference: Let MA be the multiple assignment A1 , A2 , , An ; Then the semantics of MA are defined by the following four steps (pseudocode): Step 1: For i := to n, we can consider Ai to take the form (after syntactic substitution, if necessary) Vi := Xi where Vi is the name of some declared variable and Xi is an expression whose declared type is some subtype of that of Vi Step 2: Let Ap and Aq (p < q) be such that (a) Vp and Vq are identical and (b) there is no Ar (r < p or p < r < q) such that Vp and Vr are identical Replace Aq in MA by an assignment of the form Vq := WITH Xp AS Vq : Xq and remove Ap from MA Repeat this process until no such pair Ap and Aq remains Let MA now consist of the sequence U1 := Y1 , U2 := Y2 , , Um := Ym ; where each Ui is some Vj (1 ≤ i ≤ j ≤ m ≤ n) Copyright (c) 2003 C J Date page 5.8 Step 3: Step 4: • For i := to m, evaluate Yi Let the result be yi For i := to m, assign yi to Ui █ As already indicated, multiple assignment is unorthodox but important In fact, it will become "more orthodox" with SQL:2003, which will explicitly introduce such a thing (albeit not for relational assignment, since SQL doesn't support relational assignment at all as yet): SET ( target list ) = row ; The odd thing is that SQL in fact does already support multiple assignment explicitly in the case of the UPDATE statement What's more, it supports multiple relational assignment as well, implicitly, in at least two situations: As part of its support for referential actions such as ON DELETE CASCADE As part of its (limited) support for updating (e.g.) join views Values can be converted from one type to another by means of explicit CAST operators or by coercion (implicit, by definition; the point is worth making that coercions are──presumably──possible only where explicit CASTs are possible) The book adopts the conservative position that coercions are illegal, however (for reasons of both simplicity and safety); thus, it requires comparands for "=" to be of the same type, and it requires the source and target in ":=" to be of the same type (in both cases, until we get to Chapter 20) Forward reference to Chapter 26: Domains, types, and object classes are all the same thing; hence, domains are the key to marrying object and relational technologies (i.e., the key to "object/relational" database systems) Draw the attention of students to the use of WITH (in the definition of the DIST operator), if you haven't already done so We'll be using this construct a lot 5.6 Type Generators Type generators and corresponding generated many different names Type generators have generic operators and generic constraints with reference to ARRAY (as in the book) or Copyright (c) 2003 C J Date types are known by generic "possreps" and Illustrate these ideas your own preferred page 5.9 type generator You should be aware that we will be introducing an important type generator, INTERVAL, in Chapter 23 Most generated types are nonscalar (but not all; SQL's REF types are a counterexample, as are the interval types discussed in Chapter 23) Two (definitely nonscalar) type generators of particular importance in the relational world are TUPLE and RELATION, to be discussed in the next chapter 5.7 SQL Facilities Quite frankly, this section is much longer than it ought to be, thanks to SQL's extreme lack of orthogonality (numerous special cases, constructs with overlapping but not identical functionality, unjustified exceptions, etc., all of which have to be individually explained) In fact, this very state of affairs could be used to introduce and justify the concept of orthogonality (the book itself doesn't explain this concept until Chapter 8, Section 8.6, though the term is mentioned in passing in Chapter 6) Regarding SQL built-in types: Note that bit string types were added in SQL:1992 and will be dropped again in SQL:2003! There are other examples of this phenomenon, too Why? (Rhetorical question Could the answer have anything to with "design by committee"?) You might want to note too that almost nobody──actually nobody at all, so far as I know──has implemented type BOOLEAN (which I earlier called "the most fundamental type of all") As a consequence, certain SQL expressions──in particular, those in WHERE and HAVING clauses──return a value of a type that's unknown in the language (!) The fact that SQL already supports a limited form of multiple assignment is worth noting, if you haven't already mentioned it Regarding DISTINCT types: Note all of the violations of orthogonality this construct involves! Might be an interesting exercise to list them Regarding structured types: Now this is a big topic This chapter covers the basics, but we'll have a lot more to say in Chapter (where we discuss the idea of defining tables to be "of" some structured type); Chapter 20 (where we discuss SQL's approach to type inheritance, which applies to structured types only); and Chapter 26 (where we discuss the use of structured types in SQL's approach to "object/relational" support) Copyright (c) 2003 C J Date 5.10 page Here's an example to explain──or at least illustrate──SQL's "mutators" (mention "observers" too) Consider the following assignment statement: SET P.X = Z ; P here is of type POINT and has "attributes" [sic] X and Y This assignment is defined to be equivalent to the following one: SET P = P.X ( Z ) ; The expression on the right side here invokes the "mutator" X on the variable P and passes it as argument Z That mutator invocation returns a point value identical to that previously contained in P, except that the X attribute is whatever the value of Z is That returned point value is then assigned back to P Note, therefore, that SQL's "mutators" don't really any "mutating"!──they're really read-only operators, and they return a value But that value can then be assigned to the relevant variable, thereby achieving the conventional "mutation" effect as usually understood As an exercise, you might want to think about the implications of this approach for the more complicated assignment SET LS.BEGIN.X = Z ; (Try writing out the expanded form for which this is just a shorthand.) In a somewhat similar manner, SQL's "constructors" aren't exactly constructors as usually understood in the object world In particular, they return values, not variables (and they don't allocate any storage) It is very unclear as to (a) why SQL allows some types not to have an "=" operator and (b) why it allows the semantics of that operator to be user-defined when it does exist Regarding type generators (ROW and ARRAY): There are many oddities here, some of which are noted in the text Here are some further weirdnesses of which, as an instructor, you probably ought at least to be aware: Assignment doesn't always mean assignment: Suppose X3 is of type CHAR(3) and we assign the string 'AB' to it After that assignment, the value of X3 is actually 'AB ' (note the trailing blank), and the comparison X3 = 'AB' won't give TRUE if NO PAD is in effect (see reference [4.20]) Note: Many Copyright (c) 2003 C J Date 5.11 page similar but worse situations arise when nulls are taken into account (see Chapter 19) Equality isn't always equality: Again suppose X3 is of type CHAR(3) and we assign the string 'AB' to it After that assignment, the value of X3 is actually 'AB ' (note the trailing blank), but the comparison X3 = 'AB' does give TRUE if PAD SPACE is in effect (again, see reference [4.20]).* Note: There are many other situations in SQL in which two values x and y are distinct and yet the comparison x = y gives TRUE This state of affairs causes great complexity in, e.g., uniqueness checks, GROUP BY operations, DISTINCT operations, etc ────────── * At the same time X3 LIKE 'AB' gives FALSE so two values can be equal but not "like" each other! Some people find this state of affairs amusing (Lewis Carroll, perhaps?) ────────── The following text is taken from Section 5.7: (Begin quote) [We] could define a function──a polymorphic function, in fact──called ADDWT ("add weight") that would allow two values to be added regardless of whether they were WEIGHT values or DECIMAL(5,1) values or a mixture of the two All of the following expressions would then be legal: ADDWT ADDWT ADDWT ADDWT ( ( ( ( WT, 14.7 ) 14.7, WT ) WT, WT ) 14.7, 3.0 ) (End quote) Note, however, that──even if the current value of WT is WEIGHT(3.0)──the four invocations aren't constrained to return the same value, or even values of the same type, or even of compatible types! The reason is that we're talking here about overloading polymorphism, not inclusion ditto (see Chapter 20); the four ADDWTs are thus really four different functions, and their semantics are up to the definer in each case Copyright (c) 2003 C J Date 5.12 page Suppose X and Y are of type POINT and "=" hasn't been defined for that type In order to determine whether X and Y are in fact equal, we can see whether the expression X.X = Y.X AND X.Y = Y.Y gives TRUE Likewise, if X and Y are of type LINESEG and "=" hasn't been defined for either POINT or LINESEG, we can see whether the following expression X.BEGIN.X X.BEGIN.Y X.END.X X.END.Y = = = = Y.BEGIN.X AND Y.BEGIN.Y AND Y.END.X AND Y.END.Y gives TRUE (and so on) Your comments here Answers to Exercises 5.1 For assignment, the declared types of the target variable and the source expression must be the same For equality comparison, the declared types of the comparands must be the same Note: Both of these rules will be refined somewhat in Chapter 20 5.2 For value vs variable, see Section 5.2 For type vs representation, see Section 5.3 For physical vs possible representation, see Section 5.3, subsection "Possible Representations, Selectors, and THE_ Operators." For scalar vs nonscalar, see Section 5.3, subsection "Scalar vs Nonscalar Types"; see also elaboration below For read-only vs update operators, see Section 5.5 Note: As a matter of fact, the precise nature of the scalar vs nonscalar distinction is open to some debate We appeal to that distinction in this book──quite frequently, in fact──because it does seem intuitively useful; however, it's possible that it'll be found, eventually, not to stand up to close scrutiny The issue isn't quite as clearcut as it might seem 5.3 Brief definitions: • Coercion is implicit conversion • A generated type is a type obtained by invocation of a type generator • A literal is a symbol that denotes a value that's fixed and determined by the particular symbol in question (and the type of that value is also fixed and determined by the symbol in Copyright (c) 2003 C J Date 5.13 page question) For example, is a literal value five (of type INTEGER); 'literal' the fixed value literal (of type CHAR); literal denoting the fixed value weight and so on denoting the fixed is a literal denoting WEIGHT (17.0) is a 17.0 (of type WEIGHT); • An ordinal type is a type T such that the expression v1 > v2 is defined for all pairs of values v1 and v2 of type T • An operator is said to be polymorphic if it's defined in terms of some parameter P and the arguments corresponding to P can be of different types on different invocations • A pseudovariable is an operator invocation appearing in a target position (in particular, on the left side of an assignment) THE_ pseudovariables are an important special case • A selector is an operator that allows the user to specify or select a value of the type in question by supplying a value for each component of some possible representation of that type Literals are an important special case • Strong typing means that whenever an operator is invoked, the system checks that the operands are of the right types for that operator • A THE_ operator provides access to a specified component of a specified possible representation of a specified value • A type generator is an operator that returns a type 5.4 Because they're just shorthand──any assignment that involves a pseudovariable is logically equivalent to one that does not 5.5 OPERATOR CUBE ( N RATIONAL ) RETURNS RATIONAL ; RETURN ( N * N * N ) ; END OPERATOR ; 5.6 OPERATOR FG ( P POINT ) RETURNS POINT ; RETURN ( CARTESIAN ( F ( THE_X ( P ) ), G ( THE_Y ( P ) ) ) ) ; END OPERATOR ; 5.7 OPERATOR FG ( P POINT ) UPDATES P ; THE_X ( P ) := F ( THE_X ( P ) ) , THE_Y ( P ) := G ( THE_Y ( P ) ) ; END OPERATOR ; Copyright (c) 2003 C J Date 5.14 page Note the multiple assignment here Note too that there's no explicit RETURN statement; rather, an implicit RETURN is executed when the END OPERATOR statement is reached 5.8 TYPE LENGTH POSSREP { RATIONAL } ; TYPE POINT POSSREP { X RATIONAL, Y RATIONAL } ; TYPE CIRCLE POSSREP { R LENGTH, CTR POINT } ; /* R represents (the length of) the radius of the circle */ /* and CTR the center */ The sole selector that applies to type CIRCLE is as follows: CIRCLE ( r, ctr ) /* returns the circle with radius r and center ctr */ The THE_ operators are: THE_R ( c ) /* returns the length of the radius of circle c */ THE_CTR ( c ) /* returns the point that is the center of circle c */ a OPERATOR DIAMETER ( C CIRCLE ) RETURNS LENGTH ; RETURN ( * THE_R ( C ) ) ; END OPERATOR ; OPERATOR CIRCUMFERENCE ( C CIRCLE ) RETURNS LENGTH ; RETURN ( 3.14159 * DIAMETER ( C ) ) ; END OPERATOR ; OPERATOR AREA ( C CIRCLE ) RETURNS AREA ; RETURN ( 3.14159 * ( THE_R ( C ) ** ) ) ; END OPERATOR ; We're assuming in these operator definitions that (a) multiplying a length by an integer or a rational returns a length* and (b) multiplying a length by a length returns an area (where AREA is another user-defined type) ────────── * Point for discussion: negative or zero? What if the integer or rational is ────────── b OPERATOR DOUBLE_R ( C CIRCLE ) UPDATES C ; THE_R ( C ) := * THE_R ( C ) ; Copyright (c) 2003 C J Date 5.15 page END OPERATOR ; 5.9 A triangle can possibly be represented by (a) its three vertices or (b) the midpoints of its three sides.* A line segment can possibly be represented by (a) its begin and end points or (b) its midpoint, length, and slope ────────── * As a subsidiary exercise, you might like to try proving that a triangle is indeed uniquely determined by the midpoints of its sides ────────── 5.10 No answer provided 5.11 No answer provided 5.12 Just to remind you of the possibility, we show one type definition with a nontrivial type constraint: TYPE WEIGHT POSSREP { D DECIMAL (5,1) CONSTRAINT D > 0.0 AND D < 5000.0 } ; (See also Chapter 9.) For simplicity, however, we exclude such CONSTRAINT specifications from the remaining type definitions: TYPE TYPE TYPE TYPE TYPE TYPE S# P# J# NAME COLOR QTY POSSREP POSSREP POSSREP POSSREP POSSREP POSSREP { { { { { { CHAR } ; CHAR } ; CHAR } ; CHAR } ; CHAR } ; INTEGER } ; We've also omitted the possrep names and possrep component names that the foregoing type definitions would probably require in practice 5.13 We show a typical value for each attribute S# SNAME STATUS CITY : : : : First, relvar S: S# ('S1') NAME ('Smith') 20 'London' Relvar P: Copyright (c) 2003 C J Date 5.16 page P# PNAME COLOR WEIGHT CITY : : : : : P# ('P1') NAME ('Nut') COLOR ('Red') WEIGHT (12.0) 'London' : : : J# ('J1') NAME ('Sorter') 'Paris' : : : : S# ('S1') P# ('P1') J# ('J1') QTY (200) Relvar J: J# JNAME CITY Relvar SPJ: S# P# J# QTY 5.14 a Legal; BOOLEAN b Illegal; NAME ( THE_NAME ( JNAME ) ││ THE_NAME ( PNAME ) ) Note: The idea here is to concatenate the (possible) character-string representations and then "convert" the result of that concatenation back to type NAME Of course, that conversion itself will fail on a type error, if the result of the concatenation can't be converted to a legal name c Legal; QTY d Illegal; QTY + QTY ( 100 ) e Legal; INTEGER f Legal; BOOLEAN g Illegal; THE_COLOR ( COLOR ) = P.CITY h Legal 5.15 The following observations are pertinent First, as pointed out at the end of Section 5.4, the operation of defining a type doesn't actually create the corresponding set of values; conceptually, those values already exist, and always will exist (think of type INTEGER, for example) Thus, all the "define type" operation──e.g., the TYPE statement, in Tutorial D──really does is introduce a name by which that set of values can be referenced Likewise, the DROP TYPE statement doesn't actually drop the Copyright (c) 2003 C J Date 5.17 page corresponding values, it merely drops the name that was introduced by the corresponding TYPE statement It follows that "updating an existing type" really means dropping the existing type name and then redefining that same name to refer to a different set of values Of course, there's nothing to preclude the use of some kind of "alter type" shorthand to simplify such an operation (as SQL does, in fact, at least for "structured types") 5.16 Here first are SQL type definitions for the scalar types involved in the suppliers-and-parts database: CREATE CREATE CREATE CREATE CREATE CREATE CREATE TYPE TYPE TYPE TYPE TYPE TYPE TYPE S# P# J# NAME COLOR WEIGHT QTY AS AS AS AS AS AS AS CHAR(5) CHAR(6) CHAR(4) CHAR(20) CHAR(12) DECIMAL(5,1) INTEGER FINAL FINAL FINAL FINAL FINAL FINAL FINAL ; ; ; ; ; ; ; With respect to the question of representing weights in either pounds or grams, the best we can is define two distinct types with appropriate CASTs (definitions not shown) for converting between them: CREATE TYPE WEIGHT_IN_LBS AS DECIMAL (5,1) FINAL ; CREATE TYPE WEIGHT_IN_GMS AS DECIMAL (7,1) FINAL ; Types POINT and LINESEG will become "structured" types: CREATE TYPE CARTESIAN AS ( X FLOAT, Y FLOAT ) NOT FINAL ; CREATE TYPE POLAR AS ( R FLOAT, THETA FLOAT ) NOT FINAL ; CREATE TYPE LINESEG AS ( BB CARTESIAN, EE CARTESIAN ) NOT FINAL ; 5.17 See Answer 4.1 and Answer 5.16 5.18 No answer provided 5.19 See Section 5.7, subsection "Structured Types." 5.20 No answer provided 5.21 Such a type──we call it type omega──turns out to be critically important in connection with the type inheritance model defined in reference [3.3] The details are unfortunately beyond the scope of the book and these answers; see reference [3.3] for further discussion Copyright (c) 2003 C J Date 5.18 page 5.22 We "explain" the observation by appealing to the SQL standard itself (reference [4.23]), which simply doesn't define any such constructs As for "justifying" it: We can see no good justification at all Another consequence of "design by committee"? 5.23 To paraphrase from the body of the chapter: The type designer can effectively conceal the change by a judicious choice of operators The details are beyond the scope of the book and these answers; suffice it to say that (in my own not unbiased opinion) they're far from being as straightforward as their Tutorial D counterparts, either theoretically or in their pragmatic implications 5.24 There seems to be little logical difference why CARDINALITY wasn't called COUNT It isn't clear *** End of Chapter *** Copyright (c) 2003 C J Date 5.19 page Chapter R e l a t i o n s Principal Sections • • • • • Tuples Relation types Relation values Relation variables SQL facilities General Remarks This chapter is a greatly expanded and completely rewritten version of portions of Chapter from the seventh edition It contains a very careful presentation of relation types, relation values (relations), and relation variables (relvars) Since relations are made out of tuples, it covers tuple types and values and variables as well, but note immediately that this latter topic isn't all that important in it itself──it's included only because it's needed as a stepping-stone to the former topic Caveat: Relation values are made out of tuple values, but NOT make the mistake of thinking that relation variables are made out of tuple variables! In fact, there aren't any tuple variables in the relational model at all (just as there aren't any scalar variables in the relational model either, as we saw in the previous chapter in this manual) It's worth saying right up front that relations have attributes, and attributes have types, and the types in question can be any types whatsoever (possibly even relation types): ┌────────────────────────────────────────────────────────────────┐ │ The question of what data types are supported is orthogonal │ │ to the question of support for the relational model │ └────────────────────────────────────────────────────────────────┘ Or, more catchily: "Types are orthogonal to tables" (though I'm going to argue later that it would be much better always to talk in terms of relations, not tables) 6.2 Tuples Copyright (c) 2003 C J Date page 6.1 ... THE_R ( C ) ) ; END OPERATOR ; OPERATOR CIRCUMFERENCE ( C CIRCLE ) RETURNS LENGTH ; RETURN ( 3 . 14 159 * DIAMETER ( C ) ) ; END OPERATOR ; OPERATOR AREA ( C CIRCLE ) RETURNS AREA ; RETURN ( 3 . 14 159... some of the implications: Can''t specify "uniqueness" on columns containing such values Can''t joins over such columns Can''t GROUP BY on such columns And so on Forward reference to Chapter 6: The... already covered) Read-only vs Update Operators The distinction between read-only and update operators──another logical difference!──becomes particularly important when we get to inheritance (Chapter