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

Database 如何处理多个公司使用的数据库,这些公司需要存储关于同一成员的特定和非特定数据?,database,sqlite,Database,Sqlite,我正在开发一个数据库,其中存储了各个地点的成员和员工的数据。每个位置都属于一个位置组或公司,成员数据需要保存该位置组的唯一值。但是,用于员工和成员的person和login表中保存的数据并不是唯一的和位置或组。如果为不同的位置组创建了一个成员,但该成员是同一个人,则会有重复的个人条目。有更好的方法吗? 这是我制作的第一个复杂的数据库,所以我可能没有以最好的方式制作它 我正在使用一个SQLite数据库和python,因为这是我学校所有可用的数据库。 谢谢你的帮助 编辑1: 存储的数据是人员表中

我正在开发一个数据库,其中存储了各个地点的成员和员工的数据。每个位置都属于一个位置组或公司,成员数据需要保存该位置组的唯一值。但是,用于员工和成员的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
    timestamp
    。我知道SQLite没有日期类型,它会忽略它并存储一个字符串,但现在习惯了。并将其存储为
  • 声明所有内容
    不为null
    ,除非它特别需要为null。这会让你以后省去很多头痛
  • 不要限制模式中字段的大小。你没有节省任何空间。规模限制是商业规则;它们会发生变化,应该在应用程序中强制执行。使用
    text
    varchar(255)
  • 不要将密码存储在clear中。使用图书馆
每个位置都属于一个位置组

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

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

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

在这种情况下,
member\u location
将描述某个位置的成员,该位置可能位于位置组中。它的自然键(艺术术语)是两列:成员ID和位置ID(如果您想知道成员的位置在哪个组中,这就是连接的目的),假设一个成员可能属于多个位置;否则,位置是成员的属性,而不是键的一部分

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

我可能不明白你所说的“人员进入”是什么意思。如果成员与由行表示的位置(组)关联。其他位置需要其他行。每一行都是一个明显的事实。如果您可以在不破坏事实的情况下删除“重复”的内容,那么您就走上了规范化数据库设计的道路

看看你的ERD,关系是。。。不寻常。例如,成员是登录名和个人的产物。我可以接受一个人可能有多个登录名,但一个登录名可以属于多个人吗?如果没有,则
login
可能会为登录所属的人设置一列

一个是关于惯例,一个是关于设计

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

请提供一些数据示例,好吗?一些示例数据,而不是描述,将有助于澄清情况。你现在的des有什么问题