From 4585bbd131aaab367ceee6833ca1e8287724a5b1 Mon Sep 17 00:00:00 2001 From: dvohra Date: Wed, 4 Mar 2020 11:37:56 +0000 Subject: [PATCH] Added intro to data modeling section. Patch by dvohra; Reviewed by Erick Ramirez and Jon Haddad for CASSANDRA-15481 --- CHANGES.txt | 1 + .../images/Figure_1_data_model.jpg | Bin 0 -> 17469 bytes .../images/Figure_2_data_model.jpg | Bin 0 -> 20925 bytes doc/source/data_modeling/index.rst | 1 + doc/source/data_modeling/intro.rst | 146 ++++++++++++++++++ 5 files changed, 148 insertions(+) create mode 100644 doc/source/data_modeling/images/Figure_1_data_model.jpg create mode 100644 doc/source/data_modeling/images/Figure_2_data_model.jpg create mode 100644 doc/source/data_modeling/intro.rst diff --git a/CHANGES.txt b/CHANGES.txt index 072b7c399c..a07ff9107a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.0-alpha4 + * Add data modeling introduction (CASSANDRA-15481) * Improve the algorithmic token allocation in case racks = RF (CASSANDRA-15600) * Fix ConnectionTest.testAcquireReleaseOutbound (CASSANDRA-15308) * Include finalized pending sstables in preview repair (CASSANDRA-15553) diff --git a/doc/source/data_modeling/images/Figure_1_data_model.jpg b/doc/source/data_modeling/images/Figure_1_data_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3b330e7a391146bcc8ce6098fa44f566f8a80bd GIT binary patch literal 17469 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 RXQ$wwV|B{^FWBhu{{>4UePRFr literal 0 HcmV?d00001 diff --git a/doc/source/data_modeling/images/Figure_2_data_model.jpg b/doc/source/data_modeling/images/Figure_2_data_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7acdeac02abcd20125bc036339f2376e57ab615c GIT binary patch literal 20925 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 IjzE0=A06=;dH?_b literal 0 HcmV?d00001 diff --git a/doc/source/data_modeling/index.rst b/doc/source/data_modeling/index.rst index f01c92cb24..2f799dc32c 100644 --- a/doc/source/data_modeling/index.rst +++ b/doc/source/data_modeling/index.rst @@ -20,6 +20,7 @@ Data Modeling .. toctree:: :maxdepth: 2 + intro data_modeling_conceptual data_modeling_rdbms data_modeling_queries diff --git a/doc/source/data_modeling/intro.rst b/doc/source/data_modeling/intro.rst new file mode 100644 index 0000000000..630a7d1b5b --- /dev/null +++ b/doc/source/data_modeling/intro.rst @@ -0,0 +1,146 @@ +.. Licensed to the Apache Software Foundation (ASF) under one +.. or more contributor license agreements. See the NOTICE file +.. distributed with this work for additional information +.. regarding copyright ownership. The ASF licenses this file +.. to you under the Apache License, Version 2.0 (the +.. "License"); you may not use this file except in compliance +.. with the License. You may obtain a copy of the License at +.. +.. http://www.apache.org/licenses/LICENSE-2.0 +.. +.. Unless required by applicable law or agreed to in writing, software +.. distributed under the License is distributed on an "AS IS" BASIS, +.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +.. See the License for the specific language governing permissions and +.. limitations under the License. + +Introduction +============ + +Apache Cassandra stores data in tables, with each table consisting of rows and columns. CQL (Cassandra Query Language) is used to query the data stored in tables. Apache Cassandra data model is based around and optimized for querying. Cassandra does not support relational data modeling intended for relational databases. + +What is Data Modeling? +^^^^^^^^^^^^^^^^^^^^^^ + +Data modeling is the process of identifying entities and their relationships. In relational databases, data is placed in normalized tables with foreign keys used to reference related data in other tables. Queries that the application will make are driven by the structure of the tables and related data are queried as table joins. + +In Cassandra, data modeling is query-driven. The data access patterns and application queries determine the structure and organization of data which then used to design the database tables. + +Data is modeled around specific queries. Queries are best designed to access a single table, which implies that all entities involved in a query must be in the same table to make data access (reads) very fast. Data is modeled to best suit a query or a set of queries. A table could have one or more entities as best suits a query. As entities do typically have relationships among them and queries could involve entities with relationships among them, a single entity may be included in multiple tables. + +Query-driven modeling +^^^^^^^^^^^^^^^^^^^^^ + +Unlike a relational database model in which queries make use of table joins to get data from multiple tables, joins are not supported in Cassandra so all required fields (columns) must be grouped together in a single table. Since each query is backed by a table, data is duplicated across multiple tables in a process known as denormalization. Data duplication and a high write throughput are used to achieve a high read performance. + +Goals +^^^^^ + +The choice of the primary key and partition key is important to distribute data evenly across the cluster. Keeping the number of partitions read for a query to a minimum is also important because different partitions could be located on different nodes and the coordinator would need to send a request to each node adding to the request overhead and latency. Even if the different partitions involved in a query are on the same node, fewer partitions make for a more efficient query. + +Partitions +^^^^^^^^^^ + +Apache Cassandra is a distributed database that stores data across a cluster of nodes. A partition key is used to partition data among the nodes. Cassandra partitions data over the storage nodes using a variant of consistent hashing for data distribution. Hashing is a technique used to map data with which given a key, a hash function generates a hash value (or simply a hash) that is stored in a hash table. A partition key is generated from the first field of a primary key. Data partitioned into hash tables using partition keys provides for rapid lookup. Fewer the partitions used for a query faster is the response time for the query. + +As an example of partitioning, consider table ``t`` in which ``id`` is the only field in the primary key. + +:: + + CREATE TABLE t ( + id int, + k int, + v text, + PRIMARY KEY (id) + ); + +The partition key is generated from the primary key ``id`` for data distribution across the nodes in a cluster. + +Consider a variation of table ``t`` that has two fields constituting the primary key to make a composite or compound primary key. + +:: + + CREATE TABLE t ( + id int, + c text, + k int, + v text, + PRIMARY KEY (id,c) + ); + +For the table ``t`` with a composite primary key the first field ``id`` is used to generate the partition key and the second field ``c`` is the clustering key used for sorting within a partition. Using clustering keys to sort data makes retrieval of adjacent data more efficient. + +In general, the first field or component of a primary key is hashed to generate the partition key and the remaining fields or components are the clustering keys that are used to sort data within a partition. Partitioning data improves the efficiency of reads and writes. The other fields that are not primary key fields may be indexed separately to further improve query performance. + +The partition key could be generated from multiple fields if they are grouped as the first component of a primary key. As another variation of the table ``t``, consider a table with the first component of the primary key made of two fields grouped using parentheses. + +:: + + CREATE TABLE t ( + id1 int, + id2 int, + c1 text, + c2 text + k int, + v text, + PRIMARY KEY ((id1,id2),c1,c2) + ); + +For the preceding table ``t`` the first component of the primary key constituting fields ``id1`` and ``id2`` is used to generate the partition key and the rest of the fields ``c1`` and ``c2`` are the clustering keys used for sorting within a partition. + +Comparing with Relational Data Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Relational databases store data in tables that have relations with other tables using foreign keys. A relational database’s approach to data modeling is table-centric. Queries must use table joins to get data from multiple tables that have a relation between them. Apache Cassandra does not have the concept of foreign keys or relational integrity. Apache Cassandra’s data model is based around designing efficient queries; queries that don’t involve multiple tables. Relational databases normalize data to avoid duplication. Apache Cassandra in contrast de-normalizes data by duplicating data in multiple tables for a query-centric data model. If a Cassandra data model cannot fully integrate the complexity of relationships between the different entities for a particular query, client-side joins in application code may be used. + +Examples of Data Modeling +^^^^^^^^^^^^^^^^^^^^^^^^^ + +As an example, a ``magazine`` data set consists of data for magazines with attributes such as magazine id, magazine name, publication frequency, publication date, and publisher. A basic query (Q1) for magazine data is to list all the magazine names including their publication frequency. As not all data attributes are needed for Q1 the data model would only consist of ``id`` ( for partition key), magazine name and publication frequency as shown in Figure 1. + +.. figure:: images/Figure_1_data_model.jpg + +Figure 1. Data Model for Q1 + +Another query (Q2) is to list all the magazine names by publisher. For Q2 the data model would consist of an additional attribute ``publisher`` for the partition key. The ``id`` would become the clustering key for sorting within a partition. Data model for Q2 is illustrated in Figure 2. + +.. figure:: images/Figure_2_data_model.jpg + +Figure 2. Data Model for Q2 + +Designing Schema +^^^^^^^^^^^^^^^^ + +After the conceptual data model has been created a schema may be designed for a query. For Q1 the following schema may be used. + +:: + + CREATE TABLE magazine_name (id int PRIMARY KEY, name text, publicationFrequency text) + +For Q2 the schema definition would include a clustering key for sorting. + +:: + + CREATE TABLE magazine_publisher (publisher text,id int,name text, publicationFrequency text, + PRIMARY KEY (publisher, id)) WITH CLUSTERING ORDER BY (id DESC) + +Data Model Analysis +^^^^^^^^^^^^^^^^^^^ + +The data model is a conceptual model that must be analyzed and optimized based on storage, capacity, redundancy and consistency. A data model may need to be modified as a result of the analysis. Considerations or limitations that are used in data model analysis include: + +- Partition Size +- Data Redundancy +- Disk space +- Lightweight Transactions (LWT) + +The two measures of partition size are the number of values in a partition and partition size on disk. Though requirements for these measures may vary based on the application a general guideline is to keep number of values per partition to below 100,000 and disk space per partition to below 100MB. + +Data redundancies as duplicate data in tables and multiple partition replicates are to be expected in the design of a data model , but nevertheless should be kept in consideration as a parameter to keep to the minimum. LWT transactions (compare-and-set, conditional update) could affect performance and queries using LWT should be kept to the minimum. + +Using Materialized Views +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. warning:: Materialized views (MVs) are experimental in the latest (4.0) release. + +Materialized views (MVs) could be used to implement multiple queries for a single table. A materialized view is a table built from data from another table, the base table, with new primary key and new properties. Changes to the base table data automatically add and update data in a MV. Different queries may be implemented using a materialized view as an MV's primary key differs from the base table. Queries are optimized by the primary key definition.