You do not need to include the element name in both tables. This is called a denormalized solution. You should have it only in the table of elements and refer only to the identifier, then if you need a name, you can also join it based on the primary key (id). Otherwise, this is quite normal, in my opinion.
CREATE TABLE user(
id INT(11) NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE items(
i_id INT(11) NOT NULL AUTO_INCREMENT,
name TINYTEXT NOT NULL,
price DECIMAL(8,2) NOT NULL,
PRIMARY KEY (i_id)
);
CREATE TABLE user_purchase(
i_id INT(11) NOT NULL,
name TINYTEXT NOT NULL,
id INT(11) NOT NULL,
FOREIGN KEY (i_id) REFERENCES items(i_id),
FOREIGN KEY (id) REFERENCES user(id)
);
, , . .
, .
, . , -, , , . .
, , .
.
, , .
. - . , , .
:
NF0, NF1, NF2, NF3 BCNF
. " ". , "". , , . . ?