Please consider this as an alternative. The previous two examples will both require that you make changes to the schema as the application's scope grows in addition the "custom_column" solution is difficult to extend and maintain. Eventually you'll end up with Custom_510 and then just imagine how awful this table will be to work with.
First let's use your Companies schema.
[Companies] ComnpanyId, COMPANY_NAME, CREATED_ON
Next we'll also use your Users schema for top level required attributes that will be used/shared by all companies.
[Users] UserId, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
Next we build a table where we will define our dynamic attributes that are specific to each companies custom user attributes. So here an example value of the Attribute column would be "LikeMusic":
[UserAttributeDefinition] UserAttributeDefinitionId, CompanyId, Attribute
Next we define a UserAttributes table that will hold user attribute values
[UserAttributes] UserAttributeDefinitionId, UserId, Value
This can be modified in many ways to be better for performance. You can use multiple tables for UserAttributes making each one specific to the data type being stored in Value or just leave it as a VarChar and work with it as a keyvalue store.
You also may want to move CompanyId off of the UserAttributeDefiniton table and into a cross reference table for future proofing.
Your request table looks fine, keep it as it is, just add a general concept of "keeping track of historical records" to your other tables, this will solve all your three additional requirements.
Start by implementing the concept of ownership in a separate table "ownership":
+---------------+--------------+------+-----+
| Field | Type | Null | Key |
+---------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| resource_id | int(11) | NO | |
| owner_id | int(11) | NO | |
+---------------+--------------+------+-----+
(and remove the owner_id
from resource).
Now, extend this model by adding a "history functionality" to the ownership table. There are basically two standard ways to accomplish this: either you add a nullable timestamp field to this table and use the convention "timestamp=null" means "currently valid", "timestamp set" means "ownership in the past". Or, you create a shadow table "ownership_archive", with exactly the same attributes as the "ownership" table plus the timestamp field. Then you can move old ownership records which are not valid any more after approval of a request to that table.
If necessary, you can implement similar "history functionality" for your "resource" table and your "users" table, but that will be only necessary if you need to track the history of resources and users in detail as well.
You can find a broader discussion about storing historical data in a database in this older stackoverflow question.
Best Answer
I'm not sure why you'd think that. After all, question data is very relational in nature.
Here's what I'd do:
User table
Following table (join table)
Utilizing this join table you'll be able to create a "following" relationship between users. And sure, if a user follows 100 users, then yes there will be 100 rows in the join table for that single user. That is small in reality, though, and with optimizations there would be negligible impact.