Imagine the following table. In my case, I am completely sure that name needs to be unique and not null [unique+not null = primary key]. Therefore name is a primary key. For some reasons (probably by habit), I have naturally created a primary key id column of type int.
Other assumptions: I absolutely need to keep name in my table and I am absolutely sure that name (of type varchar) will never exceed 20 characters.
Now my first question is [probably close question with yes or no expected]: do I respect BCNF Boyce-Codd Normal Form if I create such a table?
Second optional question [probably open question]: is it good practice to create column id in this case?
CREATE TABLE Y (
id int,
name varchar(20),
PRIMARY KEY(id, name)
);
If each column is unique, you probably want either
or
The FDs here are id->name and name->id.
Informally, you satisfy BCNF when every arrow in your FDs is an arrow out of a candidate key. So this satisfies BCNF.
It's not a good thing to create a surrogate id column out of habit. Think first, and make yourself aware of the tradeoffs and side effects.