Database 如何处理多个公司使用的数据库,这些公司需要存储关于同一成员的特定和非特定数据?
我正在开发一个数据库,其中存储了各个地点的成员和员工的数据。每个位置都属于一个位置组或公司,成员数据需要保存该位置组的唯一值。但是,用于员工和成员的person和login表中保存的数据并不是唯一的和位置或组。如果为不同的位置组创建了一个成员,但该成员是同一个人,则会有重复的个人条目。有更好的方法吗? 这是我制作的第一个复杂的数据库,所以我可能没有以最好的方式制作它 我正在使用一个SQLite数据库和python,因为这是我学校所有可用的数据库。 谢谢你的帮助 编辑1:Database 如何处理多个公司使用的数据库,这些公司需要存储关于同一成员的特定和非特定数据?,database,sqlite,Database,Sqlite,我正在开发一个数据库,其中存储了各个地点的成员和员工的数据。每个位置都属于一个位置组或公司,成员数据需要保存该位置组的唯一值。但是,用于员工和成员的person和login表中保存的数据并不是唯一的和位置或组。如果为不同的位置组创建了一个成员,但该成员是同一个人,则会有重复的个人条目。有更好的方法吗? 这是我制作的第一个复杂的数据库,所以我可能没有以最好的方式制作它 我正在使用一个SQLite数据库和python,因为这是我学校所有可用的数据库。 谢谢你的帮助 编辑1: 存储的数据是人员表中
存储的数据是人员表中的个人信息,由员工表和成员表使用,因此某个位置的人员可以同时是该位置的成员和员工,这意味着员工可以作为成员使用该位置的设施。成员表包含成员和位置特定的信息,例如他们签署了哪些弃权书以及可以使用哪些设施。假设同一个人可以在多个位置组中拥有成员资格,也可以在多个位置工作,这看起来很好 需要注意的是重复的会员资格。大概你不希望同一个人在同一个地点组中拥有成员资格,也不希望在同一地点工作两次。您需要唯一的索引来强制执行此操作
-- Note, with this you don't need a separate index on person_id.
create unique index unique_member_idx
on member(person_id, location_group_id);
-- And you don't need a separate index on person_id.
create unique index unique_staff_idx
on member(person_id, location_id);
您可能还希望在person.email
上放置一个唯一的索引,在插入或作为插入/更新触发器之前,小心地规范化您的电子邮件地址(将其降格,去掉前导和尾随空格)
对于位置设置,除非您存储的位字段
blob
不正确;它是用于二进制数据的。您可以将JSON存储为text
,但SQLite缺少JSON功能,因此查询它会非常慢。我建议您进行特定位置的设置
-- And one for location_group.
create table location_settings (
location_id bigint not null references location(id),
key text not null,
value text not null
);
如何为其编制索引取决于如何查询它。如果您计划查询所有位置的键值,如select location\u id,value from location\u settings where key=?
,则在key
上放置索引。否则,如果您总是使用where location\u id=?
进行查询,即使使用和key=?
进行查询,location\u id上的索引也应该可以
您可以通过为同一位置输入相同的键来添加一组值
insert into location_settings (location_id, key, value)
values (1, 'foo_list', 23), (1, 'foo_list', 42);
或者您可以坚持使用一个键并将复杂值存储为JSON
-- Do not allow duplicate keys.
create unique index location_settings_key_idx
on location_settings(key, location_id);
insert into location_settings (location_id, key, value)
values (1, 'foo_list', '[23, 42]');
还有一些其他的注释
- 将日期存储为
或datetime
。我知道SQLite没有日期类型,它会忽略它并存储一个字符串,但现在习惯了。并将其存储为timestamp
- 声明所有内容
,除非它特别需要为null。这会让你以后省去很多头痛不为null
- 不要限制模式中字段的大小。你没有节省任何空间。规模限制是商业规则;它们会发生变化,应该在应用程序中强制执行。使用
或text
varchar(255)
- 不要将密码存储在clear中。使用图书馆
位置组
的外键,而不是相反
成员数据需要保存该位置组的唯一值
这意味着,在由位置组定义的位置上,存在对成员唯一的数据。例如,东北集团的所有副总裁都可以在北墙上漆成绿色。我看到了
在这种情况下,member\u location
将描述某个位置的成员,该位置可能位于位置组中。它的自然键(艺术术语)是两列:成员ID和位置ID(如果您想知道成员的位置在哪个组中,这就是连接的目的),假设一个成员可能属于多个位置;否则,位置是成员的属性,而不是键的一部分
如果为不同的位置组创建了一个成员,但该成员是同一个人,则会有重复的个人条目
我可能不明白你所说的“人员进入”是什么意思。如果成员与由行表示的位置(组)关联。其他位置需要其他行。每一行都是一个明显的事实。如果您可以在不破坏事实的情况下删除“重复”的内容,那么您就走上了规范化数据库设计的道路
看看你的ERD,关系是。。。不寻常。例如,成员是登录名和个人的产物。我可以接受一个人可能有多个登录名,但一个登录名可以属于多个人吗?如果没有,则login
可能会为登录所属的人设置一列
一个是关于惯例,一个是关于设计
- 你会发现看到foo_id或FooID或FooID比看到idfoo更常见。DBMS系统严重依赖按字母顺序排序的列表信息,用户数据库元信息首先在名称中查找最重要的信息
- 不要盲目地将任意整数作为主键分配给每一行。查找标识信息,并使用列的组合来形成键。这将帮助您确定哪些是标识信息,哪些不是标识信息,这可能是数据库设计中最重要的方面