ok, it still is fairly complex, but breaks down to:
users
articles
categories
groups (permissions)
and then as they're multiple association, lookup tables for:
articles to categories
users to groups
categories to groups
articles to groups
and, a group has it's read/write/edit/delete settings, rolling the permissions into the groups themselves - and a group can only have 1 article, thus giving you the permissions for an individual article.
the tricky part is categories can belong to categories 😛 and I'm assuming an infinite nesting ability, with something like a category being able to have a parent category.
In order to simplify the queries, it might be as simple as ensuring that when a category is assigned to a permission group (or when that category is removed/added to a different parent) the group association relationship is cascaded down. This would mean that all categories are actually in the groups they should be (or not, if removed) without needing to check the category cascade at time of query - ie. for the purposes of figuring out of an article is viewable by a user, you just check if article's category is in a group that the user is in (that has read permission), and don't need to worry about the article's category's parent category, etc.
you're still going to be left with some complex queries, as there's multiple groups that all need checking, but it would be able to become one query at this point, i think.
make sense?