SlideShare a Scribd company logo
1 of 44
Download to read offline
10 WAYS
TO WRECK YOUR
DATABASE
   Josh Berkus
   PostgreSQL Experts, Inc.
   For O'Reilly Media, July 2009
REVENGE
against your boss
guarantee yourself
JOB SECURITY
ensure
PROJECT
FAILURE
make sure
NOBODY KNOWS
THE REAL DATA
open a
database
BACK
DOOR
force a
TOTAL
REWRITE
of the code
SLOW
DOWN
the application
to a crawl
make those stupid
DEVELOPERS
MISERABLE
10 Ways
         to:

  Lose Data
  Be Insecure
Become Unmaintainable
  Stife Changes
         and
 Make Everyone
  Miserable
One Big Spreadsheet
2. ranDom_naming(s)
          plural vs. singular
●
    users          ●
                       profle
●
    forum          ●
                       styles
●
    threads        ●
                       images
●
    posts          ●
                       survey
●
    message        ●
                       faqs
2. ranDom_naming(s)
        camel vs. underscore
●
    users            ●
                         userProfle
●
    threadCategory   ●
                         user_styles
●
    threads          ●
                         post_images
●
    posts            ●
                         survey
●
    privateMessage   ●
                         faqs
2. ranDom_naming(s)
                    felds
●
    users             ●
                          users
    ●
        frstName          ●
                              is_active
    ●
        last_name         ●
                              ACL
    ●
        login
    ●
        email
    ●
        crt_date
    ●
        lstLogin
2. ranDom_naming(s)
             Hungarian Notation
●
    tblUsers            ●
                            tblUsers
    ●
        txtFirstName        ●
                                bool_is_active
    ●
        str_last_name       ●
                                int4ACL
    ●
        txtLogin
    ●
        email
    ●
        dtcrt_date
    ●
        tmslstLogin
3&4
We don't need no
 stinking keys
3. No Real Keys
●
    Users
    ●
        userID AUTONUMBER PRIMARY KEY
    ●
        frst_name
    ●
        last_name
    ●
        login
    ●
        email
    ●
        is_active
3. No Real Keys

ID    first_name last_name         email         login password active level
21       Josh     Berkus     josh@pgexperts.com josh       jehosaphat   TRUE    u
47      Joshua    Berkus     josh@pgexperts.com joshb         dbguy     TRUE    u
198      Josh     Berkus      josh@postgresql.org joshb    jehosaphat   FALSE   u
204      Josh     Berkus       josh@agliodbs.com jberkus     joshiam    TRUE    a
4. No Foreign Keys
                     posts.content
                      Josh Berkus
                       What's up?
 users.login
                   I'm going crazy!
Josh Berkus
   jberkus
                  www.pornking.com
  jerkyboy
                          Why?
    selena
                 www.whitehouse.com
                OSCON! It's too much!
                www.whiteslavery.com
                   www.lolcats.com
                    I told you so ...
4. Fun with Orphan Rows
                    posts.content
                    Josh Berkus
                     What's up?
 users.login
                  I'm going crazy!
Josh Berkus
   jberkus

                      Why?
  selena
                www.whitehouse.com
               OSCON! It's too much!

                  www.lolcats.com
                   I told you so ...
4. Fun With Updates
INSERT INTO threads VALUES ( .... );
if $dbh('success') then
   while $these_posts.date > $cutdate
     UPDATE posts SET thread = $newthread
     WHERE id = $these_posts.id;
   if not $dbh('success') then
     while $these_posts.id > $last_id
        UPDATE posts
        SET thread = $oldthread
        WHERE id = $these_posts.id;
   DELETE FROM threads
   WHERE id = $newthread;
5. No Constraints
●
    Users
    ●
        userID AUTONUMBER PRIMARY KEY
    ●
        frst_name TEXT
    ●
        last_name TEXT
    ●
        login TEXT
    ●
        email TEXT
    ●
        is_active TEXT
5. No Constraints
●
    Users
    ●
        userID AUTONUMBER PRIMARY KEY
    ●
        frst_name VARCHAR (30)
    ●
        last_name VARCHAR (30)
    ●
        login VARCHAR (20)
    ●
        email VARCHAR (40)
    ●
        is_active BOOLEAN
5. No Constraints

first_name   last_name        email           login     password active      level
   Josh        Berkus    josh@pgexperts.com   jberkus   jehosaphat   TRUE      a
   NULL        NULL           kelley@ucb         k         NULL      FALSE     u
   Mike         Hunt      www.pornking.com    c34521      c34521     TRUE      I
    S            F           gavin@sf.gov      gavin       twitter   NULL      x
6. Non-Atomic Fields

                   name
                Josh Berkus
SELECT SUBSTR(name,STRPOS(name, ' ')) ...

                    status
                      a

   … WHERE status = 'a' OR status = 'u' ...
6. Non-Atomic Fields

                  name
               Josh Berkus
SELECT SUBSTR(name,STRPOS(name, ' ')) ...

                  status
                     i

         … WHERE status = ??? ...
6. Non-Atomic Fields
●
    Account Type
    ●
        5400 active individual
    ●
        5401 inactive individual
    ●
        5600 active board individual
    ●
        5601 inactive board individual
    ●
        6600 active corporate donor
    ●
        6601 active corporate board member
    ●
        6602 inactive corporate donor
    ●
        6603 inactive corporate board member
7. Magic Numbers



   ID = 0
7. Magic Numbers



        ID = 0
SELECT case_file, count(1)
FROM case_events
WHERE ID > 0
AND scheduled = TRUE
GROUP BY case_file;
7. Magic Numbers



2008-02-30
7. Magic Numbers



      2008-02-30
SELECT user_id, min(date)
FROM user_posts
WHERE NOT (
  extract(month from date) = 2
  and extract (day from date) = 30 )
GROUP BY user_id;
7. Magic Numbers



-1, 1, 2, 3, 4, 5, 100
7. Magic Numbers



-1, 1, 2, 3, 4, 5, 100
 SELECT household, avg(headcount)
 FROM house
 WHERE headcount BETWEEN 0 and 99
 GROUP BY household;
7. Magic Numbers



   $-0.01
7. Magic Numbers



     $-0.01
SELECT *
FROM invoices
WHERE total <> $0.01
  AND sent_on IS NULL;
7. Magic Numbers



 Document them
only in your code!
8. Polymorphic Fields

    Name         AccountType PrefContact     ContactInfo
Josh Berkus      Individual   Email        josh@pgexperts.com
John Dillinger   Board        Phone        415-555-1212
Pearson          Company      NULL         www.pearson.com
Clorox           Company      Jackie       510-555-1111 x202
9. EAV (entity-attribute-value)
         ID    Property   Setting

         407    Eyes      Brown

         407    Height     73in

         407   Married?   TRUE

         408   Married?   FALSE

         408   Smoker     FALSE

         408     Age        37

         409    Height     66in
9. EAV (entity-attribute-value)
●
    Diffcult tasks:
    ●
        Find out how many men have brown hair and are
        over 6 feet?
    ●
        Make marital status and age required, but not
        other things.
    ●
        Apply constraints to feld values.
9. EAV 2.0: E-BLOB
 ID            Properties



 407   <eyes=”brown”><height=”73”>
        <married=”1”><smoker=”1”>

 408    <hair=”brown”><age=”49”>
       <married=”0”><smoker=”0”>

 409    <age=”37”><height=”66”>
        <hat=”old”><teeth=”gold”>
10. Let The ORM
Take Care Of It
The Ten Ways
1.one big           6.non-atomic felds
 spreadsheet        7.magic numbers
2.random naming     8.polymorphic
3.no keys            felds
4.no foreign keys   9.EAV & EBlob
5.no constraints    10.ORM
Ten Ways to Fix Your Database
1.normalization   6.atomic felds
2.consistent      7.atomic felds
 naming           8.atomic felds
3.keys            9.limit EAV &
4.foreign keys     EBlob
5.constraints     10.DB design
More Wreckage
●
    Simplifying Database Design Tutorial
    –   OSCON, Monday 8:30 AM
●
    PostgreSQL Day San Jose
    –   Before OSCON, Sunday 19th, all day
    –   wiki.postgresql.org/wiki/PgDaySanJose2009
●
    Me
    –   PostgreSQL Experts: www.pgexperts.com
    –   blog: it.toolbox.com/blogs/database-soup
    –   email: josh@pgexperts.com

        This presentation copyright 2009 Josh Berkus, licensed for distribution under the
                            Creative Commons Attribution License.

More Related Content

What's hot

Powerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation PipelinePowerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation PipelineMongoDB
Β 
Structured Apps with Google Dart
Structured Apps with Google DartStructured Apps with Google Dart
Structured Apps with Google DartJermaine Oppong
Β 
Distributed Identities with OpenID
Distributed Identities with OpenIDDistributed Identities with OpenID
Distributed Identities with OpenIDBastian Hofmann
Β 
The Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystemThe Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystemHarold GimΓ©nez
Β 
Introduction to mongodb for bioinformatics
Introduction to mongodb for bioinformaticsIntroduction to mongodb for bioinformatics
Introduction to mongodb for bioinformaticsPierre Lindenbaum
Β 
An Overview of HTML5 Storage
An Overview of HTML5 StorageAn Overview of HTML5 Storage
An Overview of HTML5 StoragePaul Irish
Β 

What's hot (6)

Powerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation PipelinePowerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation Pipeline
Β 
Structured Apps with Google Dart
Structured Apps with Google DartStructured Apps with Google Dart
Structured Apps with Google Dart
Β 
Distributed Identities with OpenID
Distributed Identities with OpenIDDistributed Identities with OpenID
Distributed Identities with OpenID
Β 
The Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystemThe Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystem
Β 
Introduction to mongodb for bioinformatics
Introduction to mongodb for bioinformaticsIntroduction to mongodb for bioinformatics
Introduction to mongodb for bioinformatics
Β 
An Overview of HTML5 Storage
An Overview of HTML5 StorageAn Overview of HTML5 Storage
An Overview of HTML5 Storage
Β 

Similar to Ten Ways to Destroy Your Database

Python fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanPython fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanWei-Yuan Chang
Β 
A practical intro to web development with mongo db and nodejs when, why and how
A practical intro to web development with mongo db and nodejs  when, why and howA practical intro to web development with mongo db and nodejs  when, why and how
A practical intro to web development with mongo db and nodejs when, why and howjgarifuna
Β 
(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018Checkmarx
Β 
(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018Dor Tumarkin
Β 
Application Modeling with Graph Databases
Application Modeling with Graph DatabasesApplication Modeling with Graph Databases
Application Modeling with Graph DatabasesJosh Adell
Β 
mongoDB at Visibiz
mongoDB at VisibizmongoDB at Visibiz
mongoDB at VisibizMike Brocious
Β 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformationLars Marius Garshol
Β 
Webscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Webscale PostgreSQL - JSONB and Horizontal Scaling StrategiesWebscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Webscale PostgreSQL - JSONB and Horizontal Scaling StrategiesJonathan Katz
Β 
The Breakup - Logically Sharding a Growing PostgreSQL Database
The Breakup - Logically Sharding a Growing PostgreSQL DatabaseThe Breakup - Logically Sharding a Growing PostgreSQL Database
The Breakup - Logically Sharding a Growing PostgreSQL DatabaseFred Moyer
Β 
Sustainable TDD
Sustainable TDDSustainable TDD
Sustainable TDDSteven Mak
Β 
Efficient extraction of data using binary search and ordering information
Efficient extraction of data using binary search and ordering informationEfficient extraction of data using binary search and ordering information
Efficient extraction of data using binary search and ordering informationSecurity B-Sides
Β 
The disaster of mutable state
The disaster of mutable stateThe disaster of mutable state
The disaster of mutable statekenbot
Β 
Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7Brian Hogan
Β 
Hacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce CompanyHacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce CompanyMongoDB
Β 
PgREST: Node.js in the Database
PgREST: Node.js in the DatabasePgREST: Node.js in the Database
PgREST: Node.js in the DatabaseAudrey Tang
Β 
Ruby 2: some new things
Ruby 2: some new thingsRuby 2: some new things
Ruby 2: some new thingsDavid Black
Β 
React Native Evening
React Native EveningReact Native Evening
React Native EveningTroy Miles
Β 
Zero to Testing in JavaScript
Zero to Testing in JavaScriptZero to Testing in JavaScript
Zero to Testing in JavaScriptpamselle
Β 

Similar to Ten Ways to Destroy Your Database (20)

Python fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanPython fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuan
Β 
55 New Features in Java 7
55 New Features in Java 755 New Features in Java 7
55 New Features in Java 7
Β 
A practical intro to web development with mongo db and nodejs when, why and how
A practical intro to web development with mongo db and nodejs  when, why and howA practical intro to web development with mongo db and nodejs  when, why and how
A practical intro to web development with mongo db and nodejs when, why and how
Β 
(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018
Β 
(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018(De)serial Killers - BSides Las Vegas & AppSec IL 2018
(De)serial Killers - BSides Las Vegas & AppSec IL 2018
Β 
Application Modeling with Graph Databases
Application Modeling with Graph DatabasesApplication Modeling with Graph Databases
Application Modeling with Graph Databases
Β 
mongoDB at Visibiz
mongoDB at VisibizmongoDB at Visibiz
mongoDB at Visibiz
Β 
The breakup
The breakupThe breakup
The breakup
Β 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformation
Β 
Webscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Webscale PostgreSQL - JSONB and Horizontal Scaling StrategiesWebscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Webscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Β 
The Breakup - Logically Sharding a Growing PostgreSQL Database
The Breakup - Logically Sharding a Growing PostgreSQL DatabaseThe Breakup - Logically Sharding a Growing PostgreSQL Database
The Breakup - Logically Sharding a Growing PostgreSQL Database
Β 
Sustainable TDD
Sustainable TDDSustainable TDD
Sustainable TDD
Β 
Efficient extraction of data using binary search and ordering information
Efficient extraction of data using binary search and ordering informationEfficient extraction of data using binary search and ordering information
Efficient extraction of data using binary search and ordering information
Β 
The disaster of mutable state
The disaster of mutable stateThe disaster of mutable state
The disaster of mutable state
Β 
Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7
Β 
Hacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce CompanyHacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce Company
Β 
PgREST: Node.js in the Database
PgREST: Node.js in the DatabasePgREST: Node.js in the Database
PgREST: Node.js in the Database
Β 
Ruby 2: some new things
Ruby 2: some new thingsRuby 2: some new things
Ruby 2: some new things
Β 
React Native Evening
React Native EveningReact Native Evening
React Native Evening
Β 
Zero to Testing in JavaScript
Zero to Testing in JavaScriptZero to Testing in JavaScript
Zero to Testing in JavaScript
Β 

More from PostgreSQL Experts, Inc.

PostgreSQL Replication in 10 Minutes - SCALE
PostgreSQL Replication in 10  Minutes - SCALEPostgreSQL Replication in 10  Minutes - SCALE
PostgreSQL Replication in 10 Minutes - SCALEPostgreSQL Experts, Inc.
Β 
PWNage: Producing a newsletter with Perl
PWNage: Producing a newsletter with PerlPWNage: Producing a newsletter with Perl
PWNage: Producing a newsletter with PerlPostgreSQL Experts, Inc.
Β 
5 (more) Ways To Destroy Your Community
5 (more) Ways To Destroy Your Community5 (more) Ways To Destroy Your Community
5 (more) Ways To Destroy Your CommunityPostgreSQL Experts, Inc.
Β 
Preventing Community (from Linux Collab)
Preventing Community (from Linux Collab)Preventing Community (from Linux Collab)
Preventing Community (from Linux Collab)PostgreSQL Experts, Inc.
Β 
Elephant Roads: PostgreSQL Patches and Variants
Elephant Roads: PostgreSQL Patches and VariantsElephant Roads: PostgreSQL Patches and Variants
Elephant Roads: PostgreSQL Patches and VariantsPostgreSQL Experts, Inc.
Β 

More from PostgreSQL Experts, Inc. (20)

Shootout at the PAAS Corral
Shootout at the PAAS CorralShootout at the PAAS Corral
Shootout at the PAAS Corral
Β 
Shootout at the AWS Corral
Shootout at the AWS CorralShootout at the AWS Corral
Shootout at the AWS Corral
Β 
Fail over fail_back
Fail over fail_backFail over fail_back
Fail over fail_back
Β 
PostgreSQL Replication in 10 Minutes - SCALE
PostgreSQL Replication in 10  Minutes - SCALEPostgreSQL Replication in 10  Minutes - SCALE
PostgreSQL Replication in 10 Minutes - SCALE
Β 
HowTo DR
HowTo DRHowTo DR
HowTo DR
Β 
Give A Great Tech Talk 2013
Give A Great Tech Talk 2013Give A Great Tech Talk 2013
Give A Great Tech Talk 2013
Β 
Pg py-and-squid-pypgday
Pg py-and-squid-pypgdayPg py-and-squid-pypgday
Pg py-and-squid-pypgday
Β 
92 grand prix_2013
92 grand prix_201392 grand prix_2013
92 grand prix_2013
Β 
Five steps perform_2013
Five steps perform_2013Five steps perform_2013
Five steps perform_2013
Β 
7 Ways To Crash Postgres
7 Ways To Crash Postgres7 Ways To Crash Postgres
7 Ways To Crash Postgres
Β 
PWNage: Producing a newsletter with Perl
PWNage: Producing a newsletter with PerlPWNage: Producing a newsletter with Perl
PWNage: Producing a newsletter with Perl
Β 
10 Ways to Destroy Your Community
10 Ways to Destroy Your Community10 Ways to Destroy Your Community
10 Ways to Destroy Your Community
Β 
Open Source Press Relations
Open Source Press RelationsOpen Source Press Relations
Open Source Press Relations
Β 
5 (more) Ways To Destroy Your Community
5 (more) Ways To Destroy Your Community5 (more) Ways To Destroy Your Community
5 (more) Ways To Destroy Your Community
Β 
Preventing Community (from Linux Collab)
Preventing Community (from Linux Collab)Preventing Community (from Linux Collab)
Preventing Community (from Linux Collab)
Β 
Development of 8.3 In India
Development of 8.3 In IndiaDevelopment of 8.3 In India
Development of 8.3 In India
Β 
PostgreSQL and MySQL
PostgreSQL and MySQLPostgreSQL and MySQL
PostgreSQL and MySQL
Β 
50 Ways To Love Your Project
50 Ways To Love Your Project50 Ways To Love Your Project
50 Ways To Love Your Project
Β 
8.4 Upcoming Features
8.4 Upcoming Features 8.4 Upcoming Features
8.4 Upcoming Features
Β 
Elephant Roads: PostgreSQL Patches and Variants
Elephant Roads: PostgreSQL Patches and VariantsElephant Roads: PostgreSQL Patches and Variants
Elephant Roads: PostgreSQL Patches and Variants
Β 

Recently uploaded

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
Β 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
Β 
FULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | DelhiFULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | Delhisoniya singh
Β 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
Β 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
Β 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
Β 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
Β 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
Β 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
Β 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
Β 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
Β 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
Β 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
Β 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
Β 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
Β 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
Β 
WhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
Β 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
Β 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
Β 

Recently uploaded (20)

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
Β 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
Β 
FULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | DelhiFULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY πŸ” 8264348440 πŸ” Call Girls in Diplomatic Enclave | Delhi
Β 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
Β 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Β 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
Β 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Β 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
Β 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Β 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Β 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
Β 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
Β 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
Β 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
Β 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Β 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
Β 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
Β 
WhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 βœ“Call Girls In Kalyan ( Mumbai ) secure service
Β 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Β 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
Β 

Ten Ways to Destroy Your Database

  • 1. 10 WAYS TO WRECK YOUR DATABASE Josh Berkus PostgreSQL Experts, Inc. For O'Reilly Media, July 2009
  • 10. 10 Ways to: Lose Data Be Insecure Become Unmaintainable Stife Changes and Make Everyone Miserable
  • 12. 2. ranDom_naming(s) plural vs. singular ● users ● profle ● forum ● styles ● threads ● images ● posts ● survey ● message ● faqs
  • 13. 2. ranDom_naming(s) camel vs. underscore ● users ● userProfle ● threadCategory ● user_styles ● threads ● post_images ● posts ● survey ● privateMessage ● faqs
  • 14. 2. ranDom_naming(s) felds ● users ● users ● frstName ● is_active ● last_name ● ACL ● login ● email ● crt_date ● lstLogin
  • 15. 2. ranDom_naming(s) Hungarian Notation ● tblUsers ● tblUsers ● txtFirstName ● bool_is_active ● str_last_name ● int4ACL ● txtLogin ● email ● dtcrt_date ● tmslstLogin
  • 16. 3&4 We don't need no stinking keys
  • 17. 3. No Real Keys ● Users ● userID AUTONUMBER PRIMARY KEY ● frst_name ● last_name ● login ● email ● is_active
  • 18. 3. No Real Keys ID first_name last_name email login password active level 21 Josh Berkus josh@pgexperts.com josh jehosaphat TRUE u 47 Joshua Berkus josh@pgexperts.com joshb dbguy TRUE u 198 Josh Berkus josh@postgresql.org joshb jehosaphat FALSE u 204 Josh Berkus josh@agliodbs.com jberkus joshiam TRUE a
  • 19. 4. No Foreign Keys posts.content Josh Berkus What's up? users.login I'm going crazy! Josh Berkus jberkus www.pornking.com jerkyboy Why? selena www.whitehouse.com OSCON! It's too much! www.whiteslavery.com www.lolcats.com I told you so ...
  • 20. 4. Fun with Orphan Rows posts.content Josh Berkus What's up? users.login I'm going crazy! Josh Berkus jberkus Why? selena www.whitehouse.com OSCON! It's too much! www.lolcats.com I told you so ...
  • 21. 4. Fun With Updates INSERT INTO threads VALUES ( .... ); if $dbh('success') then while $these_posts.date > $cutdate UPDATE posts SET thread = $newthread WHERE id = $these_posts.id; if not $dbh('success') then while $these_posts.id > $last_id UPDATE posts SET thread = $oldthread WHERE id = $these_posts.id; DELETE FROM threads WHERE id = $newthread;
  • 22. 5. No Constraints ● Users ● userID AUTONUMBER PRIMARY KEY ● frst_name TEXT ● last_name TEXT ● login TEXT ● email TEXT ● is_active TEXT
  • 23. 5. No Constraints ● Users ● userID AUTONUMBER PRIMARY KEY ● frst_name VARCHAR (30) ● last_name VARCHAR (30) ● login VARCHAR (20) ● email VARCHAR (40) ● is_active BOOLEAN
  • 24. 5. No Constraints first_name last_name email login password active level Josh Berkus josh@pgexperts.com jberkus jehosaphat TRUE a NULL NULL kelley@ucb k NULL FALSE u Mike Hunt www.pornking.com c34521 c34521 TRUE I S F gavin@sf.gov gavin twitter NULL x
  • 25. 6. Non-Atomic Fields name Josh Berkus SELECT SUBSTR(name,STRPOS(name, ' ')) ... status a … WHERE status = 'a' OR status = 'u' ...
  • 26. 6. Non-Atomic Fields name Josh Berkus SELECT SUBSTR(name,STRPOS(name, ' ')) ... status i … WHERE status = ??? ...
  • 27. 6. Non-Atomic Fields ● Account Type ● 5400 active individual ● 5401 inactive individual ● 5600 active board individual ● 5601 inactive board individual ● 6600 active corporate donor ● 6601 active corporate board member ● 6602 inactive corporate donor ● 6603 inactive corporate board member
  • 29. 7. Magic Numbers ID = 0 SELECT case_file, count(1) FROM case_events WHERE ID > 0 AND scheduled = TRUE GROUP BY case_file;
  • 31. 7. Magic Numbers 2008-02-30 SELECT user_id, min(date) FROM user_posts WHERE NOT ( extract(month from date) = 2 and extract (day from date) = 30 ) GROUP BY user_id;
  • 32. 7. Magic Numbers -1, 1, 2, 3, 4, 5, 100
  • 33. 7. Magic Numbers -1, 1, 2, 3, 4, 5, 100 SELECT household, avg(headcount) FROM house WHERE headcount BETWEEN 0 and 99 GROUP BY household;
  • 35. 7. Magic Numbers $-0.01 SELECT * FROM invoices WHERE total <> $0.01 AND sent_on IS NULL;
  • 36. 7. Magic Numbers Document them only in your code!
  • 37. 8. Polymorphic Fields Name AccountType PrefContact ContactInfo Josh Berkus Individual Email josh@pgexperts.com John Dillinger Board Phone 415-555-1212 Pearson Company NULL www.pearson.com Clorox Company Jackie 510-555-1111 x202
  • 38. 9. EAV (entity-attribute-value) ID Property Setting 407 Eyes Brown 407 Height 73in 407 Married? TRUE 408 Married? FALSE 408 Smoker FALSE 408 Age 37 409 Height 66in
  • 39. 9. EAV (entity-attribute-value) ● Diffcult tasks: ● Find out how many men have brown hair and are over 6 feet? ● Make marital status and age required, but not other things. ● Apply constraints to feld values.
  • 40. 9. EAV 2.0: E-BLOB ID Properties 407 <eyes=”brown”><height=”73”> <married=”1”><smoker=”1”> 408 <hair=”brown”><age=”49”> <married=”0”><smoker=”0”> 409 <age=”37”><height=”66”> <hat=”old”><teeth=”gold”>
  • 41. 10. Let The ORM Take Care Of It
  • 42. The Ten Ways 1.one big 6.non-atomic felds spreadsheet 7.magic numbers 2.random naming 8.polymorphic 3.no keys felds 4.no foreign keys 9.EAV & EBlob 5.no constraints 10.ORM
  • 43. Ten Ways to Fix Your Database 1.normalization 6.atomic felds 2.consistent 7.atomic felds naming 8.atomic felds 3.keys 9.limit EAV & 4.foreign keys EBlob 5.constraints 10.DB design
  • 44. More Wreckage ● Simplifying Database Design Tutorial – OSCON, Monday 8:30 AM ● PostgreSQL Day San Jose – Before OSCON, Sunday 19th, all day – wiki.postgresql.org/wiki/PgDaySanJose2009 ● Me – PostgreSQL Experts: www.pgexperts.com – blog: it.toolbox.com/blogs/database-soup – email: josh@pgexperts.com This presentation copyright 2009 Josh Berkus, licensed for distribution under the Creative Commons Attribution License.