In the case where you want to store each piece of data as a unique entry (row) in the database, then a custom table, as you’ve already done, is a perfectly fine solution.
On the other hand…
You could use the usermeta table to do the exact same thing, storing multiple meta keys with the same name as unique entries,
Entries in the usermeta table would look like the following:
umeta_id user_id meta_key meta_value
1 1 follower user_1
2 1 follower user_2
3 1 follower user_3
4 1 randomkey abcdef
5 1 follower user_4
As you can see in the example above, the fourth entry in the usermeta table is for a piece of completely unrelated metadata, so that is what you will contend with, all kinds of data mixed into the one table. Overtime, if this table contains a lot of extra meta information in addition to your follow-data then it can possibly effect the performance of your queries.
Personally I would create a custom table and only store user_id and follower_id (possibly the follower_username too).
primary_id user_id follower_id follower_username
1 1 2 name2
2 1 2 name2
3 2 5 name5
4 1 8 name8
5 1 3 name3
Storing the username along with the ID is optional but useful.
Then I’d also store a serialized value of all people following a user against the individual user within usermeta table which you can do periodically via wp_cron. If you need to show a given user who is following them, you can retrieve an individual usermeta meta_key, unserialize the data and present it accordingly.
If you happen to also store the username of the follower, the serialized data for a user will also contain the username which will avoid you needing to run a lookup on the returned ID if all you need to show is a username and possibly a link to the user.
The ID is returned if you need to perform any additional data retrieval and manipulation which you can do from the username alone but, an ID is always handy and for me, it’s preferred.
Of course all of this is highly generalized because it really depends on your extended use case as to what you may do.