Types would necessarily need to contain at least one attribute. Remember that types don’t carry any data themselves, so if they didn’t contain at least one attribute, they wouldn’t have a reason to exist. (Note that a type might have a built-in attribute which carries data, which we’ll talk about soon.)
The assignment of an attribute type to a content type is many-to-many, meaning assigning an attribute with the type of “Text” to the Article type and calling it Title now creates a single assignment – the Title on Article is not the same as the Title on Employee Profile. The term attribute assignment refers to the instance of an attribute assigned to a type.
Technically, when we talk about an “attribute” in the context of it existing on a type, we should always say “attribute assignment,” because we’re talking about a specific attribute type assigned to a specific content type with a specific name. However, this is awkward, so we’ll use the less semantically-pure option and just say “attribute.”
The assignment of an attribute usually allows assignment settings to govern the behavior of that attribute on that content type. Occasionally, a system will allow you to save these settings and reuse the resulting combination of type and settings multiple times.
Finally, a content type is a unique combination of attributes. Could you have two content types, both with the exact same collection of attributes? Yes…but what would be the point? If two types have the exact same collection of attribute types with the exact same settings, then they are functionally the same type.