Is there a better way to handle a multi-level ParentId table structure?
I would always store the intermediate entities, possibly by adding missing ones as dummy entries, so that you can query using always the same query.
E.g., store

Book &gt; Chapter

as

Book Series (dummy) &gt; Book &gt; Volume (dummy) &gt; Chapter

Now, you can query
SELECT * 
FROM
   BookSeries bs
   LEFT JOIN Book b      ON bs.BookSeriesID = b.BookSeriesID 
   LEFT JOIN Volume v    ON b.BookID = v.BookID
   LEFT JOIN Chapter c   ON v.VolumeID = c.VolumeID

where BookSeries and Volume will yield NULL columns, except for primary and foreign keys.
So, always store starting with BookSeries and end at the desired level. So If you want to store a book with no volume and no chapter, this is fine. The query will yield NULL columns for volumes and chapters (inlcuding for primary and foreign keys). This is ensured by the LEFT JOIN.
Journals have a different structure. Here two approaches are possible:

Store journals as independent hierarchy in other tables.
(partially) unify the two hierarchies and use a Type or Kind field as a discriminator to differentiate between books and journals
BookSeries &gt; BookOrJournal &gt; Volume +--&gt; Issue &gt; Article
                                    |
                                    \--&gt; Chapter