I usually use default during NOT NULL design, unless the reason is otherwise - in particular, columns with money / decimal places in accounting - usually There is no unknown aspect. It may be the case that the money column is optional (for example, a survey or business relationship system in which you place your income from a household / business - this may not be known until the link is formed by the account manager). For datetime, I would never allow a NULL RecordCreated column, for example, while a BirthDate column would allow NULL .
Columns
NOT NULL removes a lot of potential additional code and ensures that users do not have to consider NULL special processing - especially good in presentation level representations or reporting dictionaries.
I think that during development it is important to devote a lot of time to processing data types (char vs. varchar, vs nchar vs. nvarchar, money vs. decimal, int vs. varchar, GUID versus identity), NULL / NOT NULL, primary key, choice clustered index and nonclustered indexes and INCLUDE columns. I know that this probably sounds like everything in the design of the database, but if the answers to all these questions are understood from the front, you will have a much more understandable conceptual model.
Note that even in a database where there are no NULL columns, a LEFT JOIN in the view may result in NULL
For a specific case of the decision-making process, take a simple example Address1, Address2, Address3, etc. all varchar (50) is a fairly common scenario (which can be better represented as a single TEXT column, but let it be assumed that it modeled this path). I would not allow NULL, and I would default to an empty string. The reason for this is:
1) This is not entirely unknown - it is empty. The nature of UNKNOWN between multiple columns will never be clearly defined. It is very unlikely that you will have KNOWN Address1 and UNKNOWN Address2 - you either know the whole address or not. Unless you have restrictions, let them be empty and not allow NULL.
2) As soon as people begin to naively do such things as Address1 + @CRLF + Address2 - NULL begin with NULL to display the entire address! If you are not going to wrap them in a view using ISNULL or change the ANSI NULL settings, why not let them be empty - after all, this is how they are viewed by users.
I would probably use the same logic for the middle or middle primary, depending on how it is used - is there a difference between someone without a middle name or someone where he is unknown?
In some cases, I probably would not have allowed an empty string - and I would have done it with a constraint. For example, the name and surname of the patient, the name of the company on the client. They should never be empty or empty (or all spaces or the like). The more of these restrictions exist, the better the quality of the data, and the sooner you will understand stupid errors, such as import problems, NULL propagation, etc.