After comparing the initial data and the updated data, we can state some observations, assumptions and draw conclusions.

Observations:
1) Some book entries are simply different versions or editions of an existing book.
2) Identifiers provided by the publishers are inconsistent, contain omissions, and can be false.

Assumptions:
1) A matching book id value does not prove or disprove that two books are related.
2) A matching title does not prove or disprove that two books are related.
3) A matching publisher id value AND matching title can indicate a book match.
4) ISBN-10 and ISBN-13 are always provided by the publisher, although sometimes they are inaccurate.
5) We would feel more comfortable that X and Y are related when X[ISBN-10, ISBN-13] == Y[ISBN-10, ISBN-13]
   as long as X[title] contains Y[Title] or Y[Title] contains X[Title]

Conclusions:
1) Some book entries are simply different versions or editions of an existing book.
2) Differing versions or editions should all be entered into our database as a unique Books, and not as an alias.
3) If we don't use aliases, we still need a way to associate related books of differing versions. To accomplish this we can use an
   intermediary Association model which will contains foreign keys to both the books. With the Book model we can create a
   ManyToMany association attribute which will allow the book to access the other books which are related through the Association instances.
4) For now, we should try to detect book associations and build Association objects at the the time of book ingestion.
5) There needs to be for humans to review, create, and destroy, associations. These should be actions in the admin view.

Changes:
storage-tools.py --
    The process_book_element() function now uses values from the incoming etree to query the database for similar entries. The etree
    values and the resulting querysets are compared to determine if the etree values represent a book which should be associated with a Book
    instance contained within the querysets. If it doesn't, it is sent to a new function, create_new_book() which creates and saves a
    Book instance. If the values should be associated with an existing Book instance, the values, and the exisint Book instance are sent
    to a new function create_book_related() which makes a Book instance from the values, and an Association instance with foreign keys
    from the new, and existing, Book instances; before sending the new Book to create_new_book().
storage-models.py --
    The Alias class has been removed and replaced with an Association class which requires two foreign keys. The Book model has been overhauled to
    include a few new fields, most notably, a ManyToMany field which relates to the Association. The Book model also has new methods which can:
    1) symmetrically create Association instances between two Book instances, 2) symmetrically remove Association instances between two Book instances, and
    3) retrieve associated Book instances via Association.
storage-admin.py --
    The admin panel now displays new information and allows the admin to perform some new actions.
        admin/storage/book --
            New Displays: 1) book.version, 2) an indicates of whether the book has an Association, 3) a link to the books that
            are related via Association. 4) a filter which allows you to filter the books by book.update; YES shows the newer
            editions and NO shows the older editions.
            New Actions: 1) Associate - Takes two books and creates/saves an Association instance using the Book class method,
            add_association(). This the best way to make an Association via the admin panel, but it's not perfect. It only works
            when 2 books are selected, but gives no feedback on failure.
            2) Dissociate pair - This takes two books and deletes Associations between them using the Book class method, remove_association_pair().
            3) Remove all associations - This is an efficient way to remove associations and takes any number of Books, but it isn't
            symmetrical like the prior two Actions.
        admin/storage/book/# --
            The edit book view isn't that much different except that it shows Associations.

Review:
    Clone this repo and follow the directions in the readme.
    Once the data has been ingested, run the server and inspect the books in the admin panel.

TODO:
    1) Add tests