The biggest problem is that your queries are becoming more complex. Let's say you want to find all accounts with a balance of more than $ 10,000 with an owner. In a normalized database, it will be something like:
select firstname, lastname, accountnumber, balance from account join customeraccount using (accountnumber) join customer using (customernumber) where balance>10000
But with three column fields, it becomes
select firstname, latname, accountnumber, balance from account join customer on customer.accountnumber1=account.accountnumber or customer.accountnumber2=account.accountnumber or customer.accountnumber3=account.accountnumber where balance>10000
Each request that joins the account for the Client now becomes more complex.
Sooner or later, someone will write a request that cannot verify the account number3, or he tries to perform three tests by copying and pasting, and after copying the account number 1 twice, he forgets to change one of them. This is a mistake that is easy to notice when reading a request. If you ruin one of the three comparisons, the program will work for all customers who have only two accounts, but not for customers who have three. This is a problem that can easily test testing.
Now you need to think about how connections work when the same client has multiple accounts. If a client has two qualification accounts in any request, do you want him to be displayed once or twice?
Probably, you need to indicate in the field the account number in the client. Now you need three indexes instead of one. Additional overhead for the database.
Are you sure the maximum will never change? Because, if it is ever, now each of these requests that check three slots must be changed to check four slots. This can be a ton of work.
What do you get in exchange for all this pain? Automatic enforcement of max-3 limit. Another table. You might get better performance on some queries because there is one smaller table that needs to be joined. On the other hand, you may not get better performance, depending on many details of the internal operation of the database engine and the actual data.
Everyone said, I would say that this is almost not worth doing. Stick with a normalized database.
I speak from experience. I did something very similar to this once. We had a database in which we had to write down three types of “managers” for each book published by our organization (No. 1, responsible for budgeting and administration, No. 2, responsible for distribution, and No. 3, responsible for content (i.e. e. Editor) Since the three were different, I created three separate points. A huge mistake. It would be much better for me to create a book manager table with a type code and apply only one of each type with triggers or code. (Experience allows you to make the right decisions. Experience is achieved by making bad decisions.)