Sharding a Django Project
I agree with @DanielRoseman.  Also, how many is too many rows.  If you are careful with indexing, you can handle a lot of rows with no performance problems.  Keep your indexed values small (ints).  I've got tables in excess of 400 million rows that produce sub-second responses even when joining with other many million row tables.  
It might make more sense to break user up into multiple tables so that the user object has a core of commonly used things and then the "profile" info lives elsewhere (std Django setup).  Copies would be a small table referencing books which has the bulk of the data.  Considering how much ram you can put into a DB server these days, sharding before you have too seems wrong.
I'm starting a Django project and need to shard multiple tables that are likely to all be of too many rows. I've looked through threads here and elsewhere, and followed the Django multi-db documentation, but am still not sure how that all stitches together. My models have relationships that would be broken by sharding, so it seems like the options are to either drop the foreign keys of forgo sharding the respective models.
For argument's sake, consider the classic Authot, Publisher and Book scenario, but throw in book copies and users that can own them. Say books and users had to be sharded. How would you approach that? A user may own a copy of a book that's not in the same database.
In general, what are the best practices you have used for routing and the sharding itself? Did you use Django database routers, manually selected a database inside commands based on your sharding logic, or overridden some parts of the ORM to achive that?
I'm using PostgreSQL on Ubuntu, if it matters.
Many thanks.