簡體   English   中英

為什么要創建僅包含索引的MySql表?

[英]Why should I create a MySql table containing index only?

我正在關注Java Spring教程,以學習有關Web應用程序中安全登錄的一些基本信息。 在本教程中,作者創建了3個MySql表來管理身份驗證:

CREATE TABLE `roles` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `role` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `users` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `login` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `user_roles` (
  `user_id` int(6) NOT NULL,
  `role_id` int(6) NOT NULL,
  KEY `user` (`user_id`),
  KEY `role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表“角色”包含用戶角色(例如“管理員”,“用戶”等)。 表“用戶”包含用戶登錄名和密碼。

所以,我不明白為什么創建了表“ user_roles”! “角色”和“用戶”之間的關系是一對一的,因此我可以為這兩個表插入索引並刪除“ user_roles” ...對嗎? 為什么我需要加入“用戶-> user_roles->角色”表而不是“用戶->角色”表?

提前致謝 :)

對於1:1關系,只有一張桌子。 (有例外,但我在這里看不到任何原因。)

如果你有很多users在每一個role ,但一個user只在一個role ,再加入role_idUsers表。 這是1:很多。 您可能需要INDEX(role_id)

如果一個user可以有很多roles而每個role可以有很多users ,那么您需要很多:很多。 這將是編寫第三張表的最佳方法:

CREATE TABLE `user_roles` (
  `user_id` int(6) NOT NULL,
  `role_id` int(6) NOT NULL,
  PRIMARY KEY (`user_id`, role_id),
  KEY         (`role_id`, user_id)
) ENGINE=InnoDB DEFAULT;

從某種意義上講,這是僅索引表,因為PRIMARY KEY包含所有字段。

INT(6) (6)中的INT(6)是沒有意義的。 特別是,它不會為您提供6位整數,但仍會為您提供最多20億個4字節有符號整數。 也許您應該使用MEDIUMINT UNSIGNED作為0..16M的值。 SMALLINT UNSIGNED用於2字節值0..64K。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM