This database has two foreign keys going to a single field, is it in 3NF? Firstly, here is a picture of the database diagram generated by SQL Power Architect.


I needed to create a user_id pair in order to match friend requests to users, but this has given me two foreign keys on the request table which link back to a single primary key on the user table. I stuck with this because PostgreSQL never flagged it as an issue.

As well as this, I have somehow ended up with a non-identifying relationship on the session to log tables.

Do I have a problem with the normalization of my database? Not all of the data depends on the tablename_id primary keys so do I need to remove them?
Normalization up to 3NF and BCNF is about FDs (functional dependencies) within a table. (We can also say that a database is in a certain normal form to mean that all of its tables are.) But FKs (foreign keys) are between tables, so they do not affect what normal forms a table is in.

(Some diagramming styles have lines that are FKs. Others have lines that are relationships represented by "association" tables. Some have both kinds of lines. Association tables have to be normalized too. You need to know what the relationship is in terms of the application.)

A FD (constraint) on a table says that when a subrow value for a (determining) column set only ever appears with the same subrow value for another (determined) column set or column. A column set that determines every attribute is a superkey. A CK (candidate key) is a superkey that contains no smaller superkey.


  A table is in 3NF if and only if, for each of its FDs X → A, at least one of the following conditions holds:
  - X contains A
  - X is a superkey
  - each attribute in A-X is contained in some CK


There is nothing wrong with having two FKs to the same table or superkey in a table:


  Just declare per what is true of your relationships/tables:
  
  
  a PK or UNIQUE NOT NULL declaration says that every subrow value in a column set is unique. Ie that the column set is a superkey. (A PK is
  just a distinguished UNIQUE NOT NULL.)
  a FK declaration says that a column list subrow value in referencing columns must also be in referenced superkey columns.
  


We can only guess at your FDs from the words you chose for table and column names. You need to tell us what they are before we can tell you what normal forms your tables satisfy. But your FKs and what they reference will have nothing to do with that.

PS Some of your tables seem to have one composite (multi-column) PK where the columns should really be two CKs, one simple (one column) and one composite.