-- CSE 414 Lecture 02 -- Relational Data Model -- Reading: 2.1, 2.2, 2.3 -- -------------------------------------------------------------------------------- -- 1. Review: Fundamental Concepts -- -- We want to store data in a database to get all the great features we -- discussed last lecture (an efficient way to ask all sorts of questions -- on the data, an easy way to update the data, recovery from crashes, -- etc.) -- We need to somehow tell the database management system (DBMS) about -- our data. For example, we may want to create a database of movies. -- We have information about movies, actors, and casts. We need to -- somehow tell the DBMS about this data. -- A DBMS allows a user to define the data stored in terms of a data model. -- A data model is a general, conceptual way of structuring data -- 1.1 Data model: general, conceptual way of structuring data -- -- Data models studied in this course: -- relational data model -- data = relations -- semistructured data model (XML) -- data = a tree -- -- Other data models: -- key-value pairs -- used by the NoSQL systems -- graph data model -- used by RDF -- object-oriented -- often used as a layer over relational model -- -- -- Note: a data model describes both the data AND a query language -- -- 1.2 Schema -- the structure of a particular database under a certain data model -- -- 1.3 Instance -- the actual data -- -------------------------------------------------------------------- -- 2. The relational Data Model -- Database instance: -- -- "table" or "relation" -- -- "column" or "attribute" or "field" -- -- "row" or "tuple" or "record" -- -- Cardinality of relation instance: nb tuples -- Database schema: -- -- "table name" or "relation name" -- -- "column name" or "attribute name" -- -- each attribute has a "type" or "domain" -- -- Degree (or arity) of relation: nb attributes -- -- Types or datatypes -- -- -- Character strings: CHAR(20), VARCHAR(50), TEXT -- -- Numbers: INT, BIGINT, SMALLINT, FLOAT -- -- Others: MONEY, DATETIME, -- -- -- Types are vendor specific -- -- Types are static and strictly enforced; -- exception: sqlite has dynamic types -- http://www.sqlite.org/datatype3.html -- -- Keys: -- an attribute is called a "key" if it uniquely identifies a record -- -- We can have a key with multiple attributes: what does this mean ? -- It means that each unique combination of values for those attributes -- uniquely determines the record. -- Candidate key: Minimal set of fields that uniquely identify -- each tuple in a relation (candidate key = key) -- Primary key: One candidate key can be selected as primary key -- -- Foreign keys: -- other tuples may use key values as "logical pointers" -- -- -- -- Example on Whiteboard: -- -- w/o types: Company(cname, country, no_employees, for_profit) -- w/ types: Company(cname: varchar(30), country: char(20), no_employees:int, for_profit:char(1)) -- specify keys by underlining -- -- Note: if we had a semistructured data model, we would create -- a tree. We would say: At the root, there is a company. Below it, there are -- departments. Each department has employees as its children, etc. -- -- A database instance is the actual content of the tables in the database. -- -------------------------------------------------------------------------------- -- 3. The Relational Data Model in SQL -- -- We will use SQLite in class -- -- -- 3.1 Creating tables -- create table Company (cname varchar(20) primary key, country varchar(20), no_employees int, for_profit char(1)); insert into Company values ('GizmoWorks', 'USA', 20000,'y'); insert into Company values ('Canon', 'Japan', 50000,'y'); insert into Company values ('Hitachi', 'Japan', 30000,'y'); insert into Company values('Charity', 'Canada', 500,'n'); select * from Company; -- Making sure SQL Lite shows us the data in a nicer format -- These commands are specific to SQLite! .header on .mode column .nullvalue NULL -- -- -- Comment: upper/lower case; name conflicts -- -- Company, company, COMPANY = all the same -- -- Company(cname, country), Person(pname, country) = repeated 'country' OK -- -- Company(cname, country), Person(pname, company) = the attribute 'company' not ok -- Null values: whenever we don't know the value, we can set it to NULL insert into Company values('MobileWorks', 'China', null, null); select * from Company; -- Deleting tuples from the database: delete from Company where cname = 'Hitachi'; select * from Company; delete from Company where for_profit = 'n'; -- what happens here?? select * from Company; -- note: sql lite is REALLY light: it accepts many erroneous commands, -- which other RDBMS would not accept. We will flag these as alerts. -- Alert 1: sqlite allows a key to be null insert into Company values(NULL, 'Somewhere', 0, 'n'); select * from Company; -- this is dangerous, since we cannot uniquely identify the tuple -- better delete it before we get into trouble delete from Company where country = 'Somewhere'; select * from Company; -- Discussion in class: -- tables are NOT ordered. They represent sets or bags. -- tables do NOT prescribe how they should be implemented: PHYSICAL DATA INDEPENDENCE! -- tables are FLAT (all attributes are base types) -- Discussion: how would you implement a table? -- row oriented -- column oriented -- vertically partitioned -- horizontally partitioned -- What are the pros/cons of the different physical implementations ? -- Why is physical data independence important? -- It is important so that we can optimize the data layout on disk for -- performance without breaking the applications written on top of the database! -- 3.2 Altering a table in SQL -- Add/Drop attribute(s) -- let's drop the for_profit attribute: -- Note: SQL Lite does not support dropping an attribute: -- ALTER TABLE Company DROP for_profit; -- doesn't work ALTER TABLE Company ADD ceo varchar(20); select * from Company; UPDATE Company SET ceo='Brown' WHERE cname = 'Canon'; SELECT * FROM Company; -- A peek at the physical implementation: -- What happens when you alter a table ? Consider row-wise and column-wise. -- 3.3 Multiple Tables, and Keys - Foreign Keys -- Now alter Company to add the products that they manufacture. -- Problem: can't add an attribute that is a LIST OF PRODUCTS. What should we do?? -- -- -- Create a separate table Product, with a foreign key to the company: create table Product (pname varchar(20) primary key, price float, category varchar(20), manufacturer varchar(20) references Company); -- Alert 2: sqlite does NOT enforce foreign keys by default. To enable -- foreign keys use the following command. The command will have no -- effect if your version of SQLite was not compiled with foreign keys -- enabled. Do not worry about it. PRAGMA foreign_keys=ON; insert into Product values('Gizmo', 19.99, 'gadget', 'GizmoWorks'); insert into Product values('PowerGizmo', 29.99, 'gadget', 'GizmoWorks'); insert into Product values('SingleTouch', 149.99, 'photography', 'Canon'); insert into Product values('MultiTouch', 199.99, 'photography', 'MobileWorks'); insert into Product values('SuperGizmo', 49.99, 'gadget', 'MobileWorks'); select * from Product; -- If we try: insert into Product values('MultiTouch2', 199.99, 'photography', 'H2'); -- We should get an error if foreign keys got enforced -- Error: foreign key constraint failed