Something I would be worried about with this approach is what will keep me from having a Student_id of 27 for Kevin, and a Teacher_ID of 27 for Mr. Jones? If you absolutely want to avoid this you could use a single base table for Person, then everyone get's their own number.
In keeping the current plan, I would pull the user_id field from the user table, ...
You'd have to add the crows feet (or whatever notation you prefer) for us to properly understand the diagram. I choose to interpret it as monotonic top-to-bottom.
Fig: Diamond pattern
As such I don't believe it is a circular reference. For that you'd have to be ...
There are a couple of scenarios where I'd consider replacing a "real" value with a surrogate & look-up.
First and most common is when I want to control the possible values in a column. I can define a table to hold the acceptable list, give it a surrogate key and reference that key in my main table. This is the classic foreign key situation.
OK, I won't rant about what is 'wrong' in your schema. I will provide an efficient way to batch the normalization for a batch insert.
I will point out two common flaws when "over-normalizing":
Don't do it if the id is bigger, on average, than the data. Note: INT is 4 bytes; BIGINT is 8.
Don't normalize "continuous" values -- anything numeric or date-...
The fastest mode in your case is to use
ORDER BY PK_KEYS
With the new table having the same PK defined on it.
This way you don't sort data even if insert in clustered table, and it will be minimally logged in simple and bulk logged recovery models.
Note this will work only if your PK is not identity where you try to ...
By defining a foreign key (FK) you are saying that the value I place in this table (the "child" or "referencing" table) must have a matching value already in the other table (the "parent" or "referenced" table). By defining User.user_id as a foreign key referencing both Student.id and also Teacher.id you are saying that the value in User must be in both ...
Indexes use space, and a 16 byte key is nothing to worry about.
So you should define the primary key on user_relations on (relating_user_id, related_user_id). If you need to search by relation_type, it won't help to put the column into the INCLUDE list, since such columns cannot be used as filter for an index scan.
I see two options:
In addition to the ...
With my original design, this view is simple to implement and it performs well. But if I get rid of the column TableB.price, how would I implement this view
create table TableA (
create table TableB (
create table SpecialDate (