
Wait for it … wait for it! I’ve got some big news I’d like to share with you:
As of 4pm yesterday, I am done with my DB Project.
I first mentioned my crazy idea of amassing a professional basketball database from scratch back in May of 2010. A few days later, I published the initial details about this massive undertaking. How naive I was back then! Well, although it’s been a tedius two-and-a-half years since then, I have finally come out the other end with a gigantic server full of stats! Here are the list of seasons my database currently covers:
• 1926-1931, 1934-1953 American Basketball League (ABL) teams and players
• 1938-1949 National Basketball League (NBL) teams and players
• 1947-1949 Basketball Association of America (BAA) teams and players
• 1968-1976 American Basketball Association (ABA) teams and players
• 1950-2012 National Basketball Association (NBA) teams and players
For each of these seasons, I have three team tables:
Team Miscellaneous Table – for all of the non-basic stats related information about the team
- Year
- League
- unique Team Abbreviation (for foreign key purposes)
- full Team Name (city + team name)
- Franchise ID (to keep track of team relocations and name changes)
- Conference and Division
- Partial Season status (if a team didn’t make it to the end of the year)
- Games Played, win-loss record and forfeited wins/losses
- Pythagorean wins-losses, Simple Rating System and Point Differential
- Team Offensive Rating, Defensive Rating, and Pace
- Offensive and Defensive Four Factors
- Arena and Attendance
- Logo image
- Team Colors
- Notes (when team disbanded, relocated, etc.)
Team Offense Table – regarding all of the stats accumulated by the roster of the team.
- Year
- League
- unique Team Abbreviation (for foreign key purposes)
- Games Played
- Team Minutes Played
- Team Field Goals, Field Goal Attempts, Three Pointers, Three Point Attempts, Free Throws, Free Throw Attempts and Percentages
- Team Offensive, Defensive and Total Rebounds
- Team Assists, Steals, Blocks, Turnovers, Personal Fouls, and Points
- Notes (how stats are determined, etc.)
Team Defense Table – regarding all of the stats accumulated by the roster of the team’s opponents.
- Year
- League
- unique Team Abbreviation (for foreign key purposes)
- Games Played
- Opponent Minutes Played
- Opponent Field Goals, Field Goal Attempts, Three Pointers, Three Point Attempts, Free Throws, Free Throw Attempts and Percentages
- Opponent Offensive, Defensive and Total Rebounds
- Opponent Assists, Steals, Blocks, Turnovers, Personal Fouls, and Points
- Notes (how stats are determined, etc.)
Each one of those tables has 1,699 separate team-season instances.
Next, I have one table that has information for every individual player-team-season instance, the Player Regular Season Table. This table has 28,655 separate player-team-season instances. Yeah, it was a ton of work.
- unique Player Identification (for foreign key purposes)
- Year
- League
- Team Abbreviation (TOT for year totals to handle players who played for multiple teams)
- First and Last Name
- Position(s) played
- Height (inches) and Weight (pounds)
- Age (as of January 1st of the year)
- Games and Minutes Played
- Field Goal, Field Goal Attempts, Three Pointers, Three Point Attempts, Free Throws and Free Throw Attempts
- Offensive, Defensive and Total Rebounds
- Assists, Steals, Blocks, Turnovers, Personal Fouls and Points
- Adjusted Pace Performance
- Notes (any miscellaneous information I want to keep track of for player)
- Edit Notes (used to keep track of changes to player data, where I acquired data, etc.)
- Partial season status
- Partial Order (to keep track of which team player was on in what order)
- Team Pace
- Similar ID (used for cloning purposes later on)
Now, the vast majority of my work was just getting in this data into the database and cleaning it. I had to make sure the players’ names were consistent, that stats for two players with the same names were separated correctly, and that players had correct height, weights and positions. There were many tasks to execute behind the scenes that wouldn’t make for a great blog – and I’m not really satisfied with what’s here now – but I just wanted to update everyone that the goal I set out to accomplish has, indeed, been accomplished!
Oh … but by no means am I really done. Not at all! I’ve still got to figure out how I wish to present this data and what I’m going to do with it. Oh, and of course I’ll be adding more and more to it – I wouldn’t be a good database builder if I didn’t succumb to scope creep!
For tonight, however, I’ll bask in this small triumph!

Nov 29, 2012 @ 15:15:36
Congrats! It’s been a long time coming…
Nov 29, 2012 @ 16:24:06
Thanks! Yeah … it’s been 2.5 years.
I’m already doing some more work to it but it’s all fun and easy, now that’s it digital in my database. I really can’t wait to publish my database for everyone at some point, but I want to make sure it’s accurate. How go your basketball experiments?
Nov 29, 2012 @ 19:54:36
Haven’t been working too much on them recently…I’ve had to readjust from my summer schedule, and I’m taking a lot more challenging classes in school this year….I’ll probably get back at it soon, though.
[The DB Project] NPBL and PBLA
Dec 11, 2012 @ 16:00:54
[...] I alluded to in my previous post, while my initial goal of a DB Project – a collection of stats from all ABL, NBL, BAA, NBA [...]
Jan 31, 2013 @ 17:39:31
Will you be adding the ABL, 1961-63? Pretty good league, lots of ABA, EBL and NBA guys. Stats are on APBR site.
Feb 01, 2013 @ 12:22:01
@Mark Absolutely! The ABL 1962/63 is definitely on my list to add, but I’m working my way from the beginning. I’ll get there, eventually!
Feb 22, 2013 @ 13:31:40
Great! Thanks!
Feb 19, 2013 @ 15:15:07
Will you be sharing this database online? Seems like the world needs something similar to the downloadable baseball database.
Feb 20, 2013 @ 11:38:33
I still haven’t decided what exactly the format of my results will be, but I’m leaning towards putting them up in a similar style to Basketball-Reference.com. Thanks for the interest, Carlos!
Apr 02, 2013 @ 10:39:55
Man! Thank you for all the effort you’ve done for this! Look, I’m an NBA History addict creating All Time Teams for Every Franchise when I have free time. Hope I could share my creations with you. Players with ratings just like in NBA Simulation Games. But when will you release it? Hope it’s downloadable.
FREE ADVICE:
Put it either in Excel or if you want to go technical, in MySql
Apr 02, 2013 @ 15:02:36
Thanks for the interest, Oswald! I’d love to see what you come up with in your own NBA historical pursuits. What are the rosters and what are you thinking of using for simulation?
Apr 02, 2013 @ 18:51:12
Stan, imagine who would be in the All Time Boston Team? Who would emerge as the leader of the pack? Would it be Russell or Bird? Will Reggie Lewis make the cut? How about the All Time Laker Team? Will D-Fish make the cut? Will Shaq and Kobe’s ego clash again? How would Magic manage the team? Yeah, that’s what I made – All Time Teams for Every Franchise. It’s so thrilling that you could imagine the Bulls with MJ, D-Rose, Pippen, Rodman and Gilmore for its starting five! Can Bulls manage to defeat their rival Pistons with Isiah, Dumars, Hill, Ben Wallace and Bob Lanier? Dr. J and Iguodala in Philly? How does Yao-Hakeem combo suit to you? Would Westbrook start over The Glove? Bob Davies, Wilt, Nate the Great, Barry, Monta, Arizin and Fulks in the Warriors Team? That’s my mission.
The thing is it’s built for NBA Games especially when I did this for NBA 2K12. Jordan with rating of 99, Kobe with 97, Magic with 98, Larry with 97. Yeah, it’s a fantasy roster.
By the way, I would like you to see that I found a thing that can help for you. It’s a excel file in nba-live.com/downloads. I can’t find it now. But I have a copy on my laptop, but sadly it’s under repair.
Apr 03, 2013 @ 12:59:02
Cool. I did a similar experiment a couple of years ago – a tournament of all-time rosters. The first year I made 10 players per team, and then went 12-deep for the second year. The only rule I had was a player could only appear on one team (or else there’d be 3 Wilts) – so the team that had the player at his best would get him. Also, each player was represented by 1 of his seasons, so I took 1989 Michael Jordan and 1994 Scottie Pippen on the All-Time Bulls. Then, I created complicated formulas to determine the players’ attributes based on their real stats from their selected year.
I, too, used the NBA 2k series to do the tournament (creating all of the players was a brutal endurance test) but started to notice a few hiccups in the simulation so I gave up.
I’d love to see your teams and how it all came out. Good luck, Oswald!
Apr 03, 2013 @ 20:16:05
Actually Stan I checked some of your work and used them as reference. I also have the rule that there must be no duplication because if that happens will see the Lakers full of centers (Wilt, Kareem, Howard, Shaq). Imagine other teams having no chance with those guys. Hahahaha