在MySQL中是否可以在将行插入到table1中时自动将行插入到table2中?
说我有以下基本结构:
用户表
id int(8) - primary key - auto increment username varchar(20)
UserPrivacy表 -userprivacy.userId是一个外键user.id
userprivacy.userId
user.id
id int(8) - primary key - auto increment userId int(8) - foreign key
我可以将具有默认值的行插入到“ 用户隐私表”中 ,但是在user.id运行查询(例如,INSERT INTO user (username) VALUES ('Bob');
INSERT INTO user (username) VALUES ('Bob');
除了触发器之外,还有其他方法user吗?还是最好在插入用户时只运行两个查询?
user
其次,如果要为每个用户存储一个值,那么拥有一个单独的userprivacy表会浪费存储空间吗?可能更有效地将其放置在用户表中?但我正在尝试使它尽可能的轻..
该user表中有更多列,在此示例中,我只是保持简单
您需要触发器才能“自动”将记录插入单独的表中。
使用单独的查询将记录插入UserPrivacy中将是实现此记录的最常见方法。
如果是一对一关系,则将其放在同一表中可以进行更简单的查询(无需联接)。
决定,决定…
对于一对(零对一)关系,有更多因素需要考虑。
如果UserPrivacy表很大,则可以将其放在单独的表中以节省空间。这也将更加规范化。
如果您经常查询“给我所有没有PrivacyData的用户”之类的信息,那么将其放在单独的表中可能是有意义的。由于索引不包含NULL值(默认情况下),因此对单独的表执行JOIN操作会更快。当然,解决方法是使用非NULL的值表示“无隐私设置”,但是低基数也会对性能产生负面影响。在这种情况下,最好使用单独的表。
另外,如果隐私数据(而不是用户数据)经常更新,则单独的表将防止用户表上的行锁定,并且在较小的表上更新速度更快,这可能会提高性能。
如果您经常需要不带UserData的UserPrivacy数据,反之亦然,则可能需要将它们分开。
不过,这可能是过早的优化。如果它们与您的模型更好地匹配,您可能只想将它们分开。考虑将其保存在同一张表中的简单性,而不是性能,大小和可读性的问题。
如果关系是一对一(零对多),显然您需要一个单独的表,但是对于一对一(零对一),它是可选的。
最后…
只要有理由,不要害怕将它们分开。