Bill Karwin — «SQL Antipatterns
Total Page:16
File Type:pdf, Size:1020Kb
What Readers Are Saying About SQL Antipatterns I am a strong advocate of best practices. I prefer to learn from other people’s mistakes. This book is a comprehensive collection of those other people’s mistakes and, quite surprisingly, some of my own. I wish I had read this book sooner. Marcus Adams Senior Software Engineer Bill has written an engaging, useful, important, and unique book. Software developers will certainly benefit from reading the anti- patterns and solutions described here. I immediately applied tech- niques from this book and improved my applications. Fantastic work! Frederic Daoud Author of Stripes: ...And Java Web Development Is Fun Again and Getting Started with Apache Click SQL Antipatterns is a must-read for software developers, who will frequently encounter the database design choices presented in this book. It helps development teams to understand the consequences of their database designs and to make the best decisions possible based on requirements, expectations, measurements, and reality. Darby Felton Cofounder, DevBots Software Development I really like how Bill has approached this book; it shows his unique style and sense of humor. Those things are really important when discussing potentially dry topics. Bill has succeeded in making the teachings accessible for developers in a good descriptive form, as well as being easy to reference later. In short, this is an excellent new resource for your pragmatic bookshelf! Arjen Lentz Executive Director of Open Query (http://openquery.com); Coauthor of High Performance MySQL, Second Edition This book is obviously the product of many years of practical expe- rience with SQL databases. Each topic is covered in great depth, and the attention to detail in the book was beyond my expectations. Although it’s not a beginner’s book, any developer with a reasonable amount of SQL experience should find it to be a valuable reference and would be hard-pressed not to learn something new. Mike Naberezny Partner at Maintainable Software; Coauthor of Rails for PHP Developers This is an excellent book for the software engineer who knows basic SQL but finds herself needing to design SQL databases for projects that go a little beyond the basics. Liz Neely Senior Database Programmer Karwin’s book is full of good and practical advice, and it was pub- lished at the right time. While many people are focusing on the new and seemingly fancy stuff, professionals now have the chance and the perfect book to sharpen their SQL knowledge. Maik Schmidt Author of Enterprise Recipes with Ruby and Rails and Enterprise Integration with Ruby Bill has captured the essence of a slew of traps that we’ve probably all dug for ourselves at one point or another when working with SQL — without even realizing we’re in trouble. Bill’s antipatterns range from “I can’t believe I did that (again!)” hindsight gotchas to tricky scenar- ios where the best solution may run counter to the SQL dogma you grew up with. A good read for SQL diehards, novices, and everyone in between. Danny Thorpe Microsoft Principal Engineer; Author of Delphi Component Design SQL Antipatterns Avoiding the Pitfalls of Database Programming Bill Karwin The Pragmatic Bookshelf Raleigh, North Carolina Dallas, Texas Many of the designations used by manufacturers and sellers to distinguish their prod- ucts are claimed as trademarks. Where those designations appear in this book, and The Pragmatic Programmers, LLC was aware of a trademark claim, the designations have been printed in initial capital letters or in all capitals. The Pragmatic Starter Kit, The Pragmatic Programmer, Pragmatic Programming, Pragmatic Bookshelf and the linking g device are trademarks of The Pragmatic Programmers, LLC. Every precaution was taken in the preparation of this book. However, the publisher assumes no responsibility for errors or omissions, or for damages that may result from the use of information (including program listings) contained herein. Our Pragmatic courses, workshops, and other products can help you and your team create better software and have more fun. For more information, as well as the latest Pragmatic titles, please visit us at http://www.pragprog.com Copyright © 2010 Bill Karwin. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmit- ted, in any form, or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior consent of the publisher. Printed in the United States of America. ISBN-10: 1-934356-55-7 ISBN-13: 978-1-934356-55-5 Printed on acid-free paper. P1.0 printing, May 2010 Version: 2010-6-9 Contents 1 Introduction 13 1.1 Who This Book Is For .................... 14 1.2 What’s in This Book .................... 15 1.3 What’s Not in This Book . 17 1.4 Conventions ......................... 18 1.5 Example Database ..................... 19 1.6 Acknowledgments ...................... 22 I Logical Database Design Antipatterns 24 2 Jaywalking 25 2.1 Objective: Store Multivalue Attributes . 26 2.2 Antipattern: Format Comma-Separated Lists . 26 2.3 How to Recognize the Antipattern . 29 2.4 Legitimate Uses of the Antipattern . 30 2.5 Solution: Create an Intersection Table . 30 3 Naive Trees 34 3.1 Objective: Store and Query Hierarchies . 35 3.2 Antipattern: Always Depend on One’s Parent . 35 3.3 How to Recognize the Antipattern . 39 3.4 Legitimate Uses of the Antipattern . 40 3.5 Solution: Use Alternative Tree Models . 41 4 ID Required 54 4.1 Objective: Establish Primary Key Conventions . 55 4.2 Antipattern: One Size Fits All . 57 4.3 How to Recognize the Antipattern . 61 4.4 Legitimate Uses of the Antipattern . 61 4.5 Solution: Tailored to Fit . 62 CONTENTS 8 5 Keyless Entry 65 5.1 Objective: Simplify Database Architecture . 66 5.2 Antipattern: Leave Out the Constraints . 66 5.3 How to Recognize the Antipattern . 69 5.4 Legitimate Uses of the Antipattern . 70 5.5 Solution: Declare Constraints . 70 6 Entity-Attribute-Value 73 6.1 Objective: Support Variable Attributes . 73 6.2 Antipattern: Use a Generic Attribute Table . 74 6.3 How to Recognize the Antipattern . 80 6.4 Legitimate Uses of the Antipattern . 80 6.5 Solution: Model the Subtypes . 82 7 Polymorphic Associations 89 7.1 Objective: Reference Multiple Parents . 90 7.2 Antipattern: Use Dual-Purpose Foreign Key . 91 7.3 How to Recognize the Antipattern . 94 7.4 Legitimate Uses of the Antipattern . 95 7.5 Solution: Simplify the Relationship . 96 8 Multicolumn Attributes 102 8.1 Objective: Store Multivalue Attributes . 102 8.2 Antipattern: Create Multiple Columns . 103 8.3 How to Recognize the Antipattern . 106 8.4 Legitimate Uses of the Antipattern . 107 8.5 Solution: Create Dependent Table . 108 9 Metadata Tribbles 110 9.1 Objective: Support Scalability . 111 9.2 Antipattern: Clone Tables or Columns . 111 9.3 How to Recognize the Antipattern . 116 9.4 Legitimate Uses of the Antipattern . 117 9.5 Solution: Partition and Normalize . 118 Report erratum this copy is (P1.0 printing, May 2010) CONTENTS 9 II Physical Database Design Antipatterns 122 10 Rounding Errors 123 10.1 Objective: Use Fractional Numbers Instead of Integers 124 10.2 Antipattern: Use FLOAT Data Type . 124 10.3 How to Recognize the Antipattern . 128 10.4 Legitimate Uses of the Antipattern . 128 10.5 Solution: Use NUMERIC Data Type . 128 11 31 Flavors 131 11.1 Objective: Restrict a Column to Specific Values . 131 11.2 Antipattern: Specify Values in the Column Definition . 132 11.3 How to Recognize the Antipattern . 135 11.4 Legitimate Uses of the Antipattern . 136 11.5 Solution: Specify Values in Data . 136 12 Phantom Files 139 12.1 Objective: Store Images or Other Bulky Media . 140 12.2 Antipattern: Assume You Must Use Files . 140 12.3 How to Recognize the Antipattern . 143 12.4 Legitimate Uses of the Antipattern . 144 12.5 Solution: Use BLOB Data Types As Needed . 145 13 Index Shotgun 148 13.1 Objective: Optimize Performance . 149 13.2 Antipattern: Using Indexes Without a Plan . 149 13.3 How to Recognize the Antipattern . 153 13.4 Legitimate Uses of the Antipattern . 154 13.5 Solution: MENTOR Your Indexes . 154 III Query Antipatterns 161 14 Fear of the Unknown 162 14.1 Objective: Distinguish Missing Values . 163 14.2 Antipattern: Use Null as an Ordinary Value, or Vice Versa 163 14.3 How to Recognize the Antipattern . 166 14.4 Legitimate Uses of the Antipattern . 168 14.5 Solution: Use Null as a Unique Value . 168 Report erratum this copy is (P1.0 printing, May 2010) CONTENTS 10 15 Ambiguous Groups 173 15.1 Objective: Get Row with Greatest Value per Group . 174 15.2 Antipattern: Reference Nongrouped Columns . 174 15.3 How to Recognize the Antipattern . 176 15.4 Legitimate Uses of the Antipattern . 178 15.5 Solution: Use Columns Unambiguously . 179 16 Random Selection 183 16.1 Objective: Fetch a Sample Row . 184 16.2 Antipattern: Sort Data Randomly . 184 16.3 How to Recognize the Antipattern . 185 16.4 Legitimate Uses of the Antipattern . 186 16.5 Solution: In No Particular Order. 186 17 Poor Man’s Search Engine 190 17.1 Objective: Full-Text Search . 191 17.2 Antipattern: Pattern Matching Predicates . 191 17.3 How to Recognize the Antipattern . 192 17.4 Legitimate Uses of the Antipattern . 193 17.5 Solution: Use the Right Tool for the Job . 193 18 Spaghetti Query 204 18.1 Objective: Decrease SQL Queries . 205 18.2 Antipattern: Solve a Complex Problem in One Step . 205 18.3 How to Recognize the Antipattern . 207 18.4 Legitimate Uses of the Antipattern . 208 18.5 Solution: Divide and Conquer . 209 19 Implicit Columns 214 19.1 Objective: Reduce Typing .