如何处理多个公司使用的数据库,这些公司需要存储关于同一成员的特定和非特定数据



我正在开发一个数据库,该数据库存储位置的成员和员工数据。每个位置都属于一个位置组或公司,成员数据需要包含该位置组唯一的值。但是,用于员工和成员的个人和登录表中的数据并不是唯一的,也不是唯一的位置或组。如果一个成员是为不同的位置组创建的,但是同一个人,则会出现重复的个人条目。有更好的方法吗?这是我制作的第一个复杂的数据库,所以我可能没有用最好的方法。

与该问题相关的表的ERD,这是迄今为止完整的ERD。

我正在使用一个带有python的SQLite数据库,因为这是我学校所有可用的数据库。谢谢你的帮助。

编辑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_id, value from location_settings where key = ?)的键的值,则在key上设置索引。否则,如果您总是使用where location_id = ?进行查询,即使使用and key = ?,location_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]');

其他一些注意事项。

  • 将日期存储为datetimetimestamp。我知道SQLite没有日期类型,它会忽略它并存储一个字符串,但现在就养成这个习惯。并将其存储为ISO 8601
  • 声明所有not null,除非它特别需要为null。这样以后你就不用头疼了
  • 不要限制架构中字段的大小。你没有节省任何空间。规模限制是商业规则;它们会发生变化,应该在应用程序中强制执行。使用textvarchar(255)
  • 请勿将密码存储在明文中。它们应该用一个图书馆腌制和捣碎

每个位置都属于一个位置组

这意味着每个位置都属于1(或0或1)location_group。如果是这样的话,你的表格就不会显示这一点。location应该有一个指向location_group的外键,而不是相反。

成员数据需要保存该位置唯一的值_group

这意味着在位置组定义的位置上存在成员唯一的数据。例如,东北集团的所有副总裁都可以在北墙上把办公室漆成绿色。我看到了。

在这种情况下,member_location将描述某个位置处的成员,该位置恰好在位置组中。它的自然键(艺术术语)是两列:成员ID和位置ID;否则,location是成员的属性,而不是键的一部分。

如果一个成员是为不同的位置组创建的,但是同一个人,则会有一个重复的个人条目

我可能不明白你说的";个人输入";。如果一个成员与一个位置(组)相关联,则该位置由一行表示。其他位置需要额外的行。每一行都是不同的事实。如果你能去除一些";重复的";在不破坏事实的情况下,您正在实现数据库设计的规范化。

看看你的ERD,关系是。。。特别的例如,成员是一个登录名和一个人的产品。我可以接受一个人可能有多个登录名,但一个登录名可以属于多个人吗?如果不是,那么login可能会有一个登录所属人员的列。

一条关于惯例,一条关于设计。

  • 您会发现看到foo_id、FooID或FooID比idfoo更常见。DBMS系统在很大程度上依赖于按字母顺序列出信息,用户数据库元信息首先在名称中查找最重要的信息
  • 不要盲目地将任意整数作为主键分配给每一行。查找标识信息,并使用列的组合来形成键。这将帮助您决定什么是识别信息,什么不是,这可能是数据库设计中最重要的方面

相关内容

最新更新