Normalization with two potential primary keys
Here is where I went wrong:

The important thing about transitive dependencies are these two key factors:


If B depends on A, and C depends on B, then C also depends on A (A → B → C)
B is not (or part of) a candidate key


In my example, I identified the following as a transitive dependency:

{ email } → { first_name, last_name }


However, this is not the case, as email is a candidate key, and so instead, if we use id as the primary key, we have a full dependency:

{ id } → { email, first_name, last_name }