比方说,我有一个名为cities
的预定义表格,其中包含我国几乎所有城市。
当用户注册自己(用户表)时,表cities_id
中的列user
存储表cities
中的城市ID(外键,参考表城市),喜欢
CREATE TABLE `cities` (
`id` int,
`city_name` varchar(100)
)
CREATE TABLE `user` (
`id` int,
`name` varchar(60)
`****`
`cities_id` FK
)
用户表存储城市ID。
但是,如果我错过了几个城市,该怎么办...用户如何将其城市名称保存在用户表中,该表不接受任何城市名称,而仅接受ID。
表city_name
中的city_id之后是否可以再添加一列user
,例如
CREATE TABLE `user` (
`id` int,
`name` varchar(60)
`****`
`cities_id` FK
`citiy name` varchar(100)
)
记录用户在注册时输入的数据?能做到吗?
答案 0 :(得分:6)
您可以在城市表标签中添加一个类型,用户找不到与其对应的城市,允许他键入其城市的名称,然后您在城市中,并将在表中创建一个对应的记录类型标记为特殊状态(方便操作人员检查和更正),同时将记录ID保存到用户记录中
CREATE TABLE `cities` (
`id` int,
`city_name` varchar(100),
`type` int,
)
CREATE TABLE `user` (
`id` int,
`name` varchar(60)
`****`
`cities_id` FK
)
答案 1 :(得分:3)
正如@Joakim在评论中提到的那样,从数据库角度来看,因为citys_id是引用城市表的外键,所以如果表中还没有该城市,则在用户表中插入记录将失败。
从编程的角度来看,如果希望在用户注册时自动自动插入表中不存在的城市,则可以。假设您正在使用Java和Hibernate,并且User实体包含City实体,则在用户实体上调用saveOrUpdate()方法将导致插入城市记录(如果尚未插入),然后将用户记录插入到User表中。
答案 2 :(得分:3)
这就是我迅速解决此问题的方式
创建一个额外的表格来存储丢失的城市,该表格将由用户介绍
CREATE TABLE `cities_users` (
`id` int,
`city_name` varchar(100),
`added_by` varchar(100),
`added_TS` DATETIME DEFAULT CURRENT_TIMESTAMP
);
创建一个将两个城市表联合的视图:
CREATE VIEW all_cities AS
SELECT id, city_name FROM `cities`
UNION ALL
SELECT id, city_name FROM `cities_users`;
无论何时用户注册,都可以查询VIEW来检查用户的城市是否存在。这样,您将知道原始表中是否存在城市或用户引入的城市。
如果没有,则将新城市插入cities_users
表中(连同创建城市以进行日志记录的用户)。
您应该正确生成一个唯一的ID,即在 city 表中永远不会存在的ID。您可以通过多种方式来完成此操作,这是一个简单的示例:取citys_users表中的最后一个ID并添加100万。您的city_users ID将类似于:1000001、1000002、1000003
最后,您将生成的city_users ID插入到users表中。
为用户输入使用单独的表应该可以帮助您保持数据库的干净:
答案 3 :(得分:2)
如果用户建议一个新城市,则应在城市表中创建一个新记录,并将city_id存储到用户表中。这是存储表记录的最佳方法。
答案 4 :(得分:0)
尽管有相反的答案,我还是应该指出,您最初建议在表中添加city_name
列的建议会很好地工作
如果您同时允许cities_id
和city_name
都为空,那么您可以验证应用程序逻辑中是否只设置了其中一个
这种方法的好处是它将使您的城市表保持“纯净”状态,并允许您轻松计算重复次数并分析用户提供的城市
但是它将在您的表中添加非常稀疏的可空city_name
列
我猜这取决于您要如何从用户那里获得城市(下拉菜单+他人的文本框,带有建议的文本框,只是一个文本框)以及您打算如何处理城市聚集了
您甚至可以通过硬编码下拉菜单或可搜索的下拉菜单将标签更改为“城市(或最近的城市)”,并且不允许用户提供城市
答案 5 :(得分:0)
如果您有一个存放原始数据的缓冲表,即city_name,user_name之间的关系
CREATE TABLE `buffer_city_user` (
`buffer_id` int,
`city_name` varchar(100),
`user_name` varchar(100),
);
您可以首先处理新的city_names的缓冲表-如果找到,则将其插入表中的city。
然后插入用户信息-任何新的城市名称都应该已经在city表中,并且不会出现任何外键问题。