Вот как я бы подошел к проблеме: во-первых, я нарисую модель предметной области. В вашем случае это выглядит так:
List(1)----contains----(0..*)-->ListItem
ListItem(0..1)----hasTags--(0..*)-->Tag
Tag(0..1)-----hasSubTags---(0..*)-->Tag
Это делает проблему явной, не оставляя места для сомнений.
Теперь переведите это в модель данных. Это довольно просто: для каждого отношения введите подходящие отображения PrimaryKey-ForeignKey. Отношения «многие ко многим» следует разбить на два отношения «1-M», используя новую таблицу между ними.
Модель данных, которая у вас есть на этом этапе, должна быть функционально правильной, но может иметь проблемы с производительностью. Сейчас самое время сосредоточиться на запросах, которые вы хотели бы, и соответственно оптимизировать структуру таблицы.
(Еще одно подобное уточнение, начинающееся с модели предметной области, даст вам дизайн и для модели окончательного класса)
Надеюсь, этот подход поможет.