| 129 | | 1. USERS(user_id, username, email, user_name, surname, password, |
| 130 | | user_created_at, user_updated_at) → satisfies BCNF |
| 131 | | |
| 132 | | 2. ADMINS(user_id) → satisfies BCNF |
| 133 | | |
| 134 | | 3. REGULAR_USER(user_id) → satisfies BCNF |
| 135 | | |
| 136 | | 4. WRITER(user_id) → satisfies BCNF |
| 137 | | |
| 138 | | 5. STORY(story_id, mature_content, short_description, image, story_content, user_id, story_created_at, story_updated_at) → satisfies BCNF |
| 139 | | 6. STATUS(story_id, status) → satisfies BCNF |
| 140 | | 7. CHAPTER(chapter_id, chapter_number, chapter_name, title, chapter_content, word_count, rating, published_at, view_count, story_id, chapter_created_at, chapter_updated_at) → satisfies BCNF |
| 141 | | 8. GENRE(genre_id, genre_name) → satisfies BCNF |
| 142 | | 9. READING_LIST(list_id, list_name, list_content, is_public, user_id, list_created_at, list_updated_at) → satisfies BCNF |
| 143 | | 10. NOTIFICATION(notification_id, notification_content, is_read, recipient_user_id, type, link, notification_created_at) → satisfies BCNF |
| 144 | | 11. CONTENT_TYPE(notification_id, content_type) → satisfies BCNF |
| 145 | | 12. AI_SUGGESTION(suggestion_id, original_text, suggested_text, accepted, suggestion_created_at, applied_at, story_id) → satisfies BCNF |
| 146 | | 13. SUGGESTION_TYPE(suggestion_id, suggestion_type) → satisfies BCNF |
| 147 | | 14. LIKES(user_id, story_id, like_created_at) → satisfies BCNF |
| 148 | | 15. COMMENT(comment_id, comment_content, user_id, story_id, comment_created_at, comment_updated_at) → satisfies BCNF |
| 149 | | 16. COLLABORATION(user_id, story_id, collab_created_at) → satisfies BCNF |
| 150 | | 17. ROLES(user_id, story_id, roles) → satisfies BCNF |
| 151 | | 18. PERMISSION_LEVEL(user_id, story_id, permission_level) → satisfies BCNF |
| 152 | | 19. HAS_GENRE(story_id, genre_id) → satisfies BCNF |
| 153 | | 20. READING_LIST_ITEMS(list_id, story_id, added_at) → satisfies BCNF |
| 154 | | 21. NOTIFY(user_id, story_id, notification_id) → satisfies BCNF |
| 155 | | 22. NEED_APPROVAL(suggestion_id, story_id, chapter_id) → satisfies BCNF |
| | 129 | We analyze each relation for BCNF violations: |
| | 130 | USERS(user_id, username, email, user_name, surname, password, user_created_at, user_updated_at) — FD2: username → user_id and FD3: email → user_id exist, but username and email are both superkeys (their closure contains all attributes of USERS). No BCNF violation. |
| | 131 | STORY(story_id, ...) — only FD4 applies, story_id is the sole candidate key and the only determinant. No BCNF violation. |
| | 132 | CHAPTER(chapter_id, ...) — FD5: chapter_id → all others, FD6: {story_id, chapter_number} → chapter_id. Both chapter_id and {story_id, chapter_number} are candidate keys, so both are superkeys. No BCNF violation. |
| | 133 | GENRE(genre_id, genre_name) — FD7: genre_id → genre_name and FD8: genre_name → genre_id. Both are candidate keys, so both are superkeys. No BCNF violation. |
| | 134 | READING_LIST(list_id, ...) — only FD9 applies, list_id is the only determinant and is the candidate key. No BCNF violation. |
| | 135 | NOTIFICATION(notification_id, ...) — only FD10 applies, notification_id is the only determinant and is the candidate key. No BCNF violation. |
| | 136 | AI_SUGGESTION(suggestion_id, ...) — only FD11 applies, suggestion_id is the only determinant and is the candidate key. No BCNF violation. |
| | 137 | COMMENT(comment_id, ...) — only FD12 applies, comment_id is the only determinant and is the candidate key. No BCNF violation. |
| | 138 | All remaining tables — no non-trivial functional dependencies beyond the primary key. No BCNF violations. |
| | 139 | Since every determinant in every relation is a superkey, all relations satisfy BCNF. |
| | 140 | === BCNF Decomposition |
| | 141 | Since no BCNF violations were identified in the BCNF Check, no decomposition is required |