Databases
NoSQL vs SQL






SQL <=> NoSQL
MySQL is easier ... hmm ... NO!
It is impossible to hide complexity!
+----+--------------------+----------------------+--------+----------------------------------------+----------------------------------+---------+--------------------------------------------+------+--------------------------+
| id | select_type        | table            | type   | possible_keys                | key                    | key_len | ref                                   | rows | Extra                      |
+----+--------------------+----------------------+--------+----------------------------------------+----------------------------------+---------+--------------------------------------------+------+--------------------------+
|  1 | PRIMARY            | dates_days       | range  | PRIMARY                      | PRIMARY                | 3       | NULL                                  |   31 | Using where; Using index   |
|  1 | PRIMARY            | CLI              | ref    | CLI_DATA_DOC,CLI_COD_BUSN_UN | CLI_DATA_DOC           | 4       | weborder.dates_days.date              |   23 |                            |
|  1 | PRIMARY            | FATT_ROWS        | ref    | FATT_ROWS_DOC_ID             | FATT_ROWS_DOC_ID       | 62      | TCross5_NP.CLI.DOC_ID                 |    4 |                            |
|  1 | PRIMARY            | ART_ANA          | eq_ref | PRIMARY                      | PRIMARY                | 92      | TCross5_NP.FATT_ROWS.COD_ART          |    1 |                            |
|  1 | PRIMARY            | web_categorie    | eq_ref | COD_CAT                      | COD_CAT                | 38      | TCross5_NP.ART_ANA.COD_CAT            |    1 |                            |
|  2 | DEPENDENT SUBQUERY | FATT_ROWS_LOTTI  | ref    | FATT_ROWS_LOTTI_ROW_ID       | FATT_ROWS_LOTTI_ROW_ID | 92      | TCross5_NP.FATT_ROWS.ROW_ID           |    1 |                            |
|  2 | DEPENDENT SUBQUERY | DDT_ROWS_LOTTI   | ref    | DDT_ROWS_LOTTI_COD_LOT       | DDT_ROWS_LOTTI_COD_LOT | 92      | TCross5_NP.FATT_ROWS_LOTTI.COD_LOT    |    1 |                            |
|  2 | DEPENDENT SUBQUERY | DDT_ROWS         | eq_ref | PRIMARY                      | PRIMARY                | 92      | TCross5_NP.DDT_ROWS_LOTTI.ROW_ID      |    1 | Using where                |
|  2 | DEPENDENT SUBQUERY | FATT_FOR_RIGHE   | eq_ref | PRIMARY                      | PRIMARY                | 92      | TCross5_NP.FATT_ROWS_LOTTI.COD_LOT    |    1 | Using where                |
+----+--------------------+----------------------+--------+----------------------------------------+----------------------------------+---------+--------------------------------------------+------+--------------------------+
SELECT SQL_CALC_FOUND_ROWS
    SUM(
          COALESCE(LINES_CONT.DARE_V1, 0)
        - COALESCE((
                SELECT
                    SUM(
                        COALESCE(FATT_ROWS_PROVV.IMPORTO_PROVV_V1, 0)
                      + COALESCE((FATT_ROWS.IMPORTO_V1-FATT_ROWS.QUANT_RIGA*web_product_price.prezzo) * web_product_price.percentuale_provvigione/100, 0)
                    ) as provv
                FROM CLI
                INNER JOIN FATT_ROWS
                    ON CLI.DOC_ID = FATT_ROWS.DOC_ID
                LEFT JOIN FATT_ROWS_PROVV
                    ON FATT_ROWS.ROW_ID = FATT_ROWS_PROVV.ROW_ID
                LEFT JOIN families
                    ON families.COD_ART = FATT_ROWS.COD_ART
                LEFT JOIN web_product_price
                    ON
                        web_product_price.COD_ART = FATT_ROWS.COD_ART
                    AND web_product_price.inizio <= FATT_ROWS.DATA_DOC
                    AND web_product_price.scadenza >= FATT_ROWS.DATA_DOC
                WHERE
                    CLI.COD_BUSN_UN = 'P'
                AND CLI.DATA_DOC >= LINES_CONT.COMP_ECON_DATA_INIZ
                AND CLI.DATA_DOC <= LINES_CONT.COMP_ECON_DATA_FINE
                AND CLI.COD_AGE = web_users.COD_AGE
        ), 0)
    ) as value,
    DATE_FORMAT(dates_days.`date`,  '' ) as date
FROM dates_days
LEFT JOIN LINES_CONT
    ON LINES_CONT.COMP_ECON_DATA_FINE = dates_days.`date` AND LINES_CONT.COD_CONTO = '3.01.62.01' AND LINES_CONT.DARE_V1 > 0
LEFT JOIN HEAD_CONT
    ON HEAD_CONT.HEAD_CONT_ID = LINES_CONT.HEAD_CONT_ID
LEFT JOIN web_users
    ON HEAD_CONT.COD_CF = web_users.code
WHERE
   dates_days.`date` >= '2015-02-02'
AND dates_days.`date` <= '2015-02-02'
Why When we need NoSQL?
Availability
Consistency
Partition tolerance
impossible
MySQL
PostgreSQL
MongoDB
Bigtable
CouchDB
Cassandra
All clients see the same view of data,
even in the presence of updates
All clients find some replica of data even in the presence of failure
The system properly holds even if it is partitioned
MySQL, PostgreSQL, MSSQL, Redis and Neo4j are available and consistent ; they don’t distribute data so they don’t require the partition tolerance
MongoDB, BigTable and Redis are consistent and partition tolerant. In the event of a network partition, they can become unavailable to certain types of queries.
CouchDB, Cassandra, DynamoDB are available and partition tolerant. CouchDB doesn’t guarantee consistency between any two server although they replicate data.
Consistency
What kind of Job require Consistency?
Being in agreement with itself
In agreement; compatible
Having at least one common solution, as of two or more equations or inequalities
Holding true as a group; not contradictory
Describe kind of person which may be doing job consistently?
Availability
What kind of Job require availability?
Capable of being gotten; obtainable
The quality of being at hand when needed
Qualified and willing to serve or assist
Describe kind of person which can be seen as always available?
Partition tolerance
What kind of Job require to be a Partition tolerant?
A division into parts; separation
Describe kind of person which can be seen as Partition tolerant?
The decomposition of a set into a family of disjoint sets
To divide into parts, pieces, or sections