
我正在看phpmyadmin,我看到一些看起来像mysql中的子数据库.这叫什么!?当然我试图搜索谷歌,但我没有走得太远因为我甚至不知道这些东西被称为什么?模式?子数据库?任何帮助,将不胜感激.TY.
我有一个 django 模型,它的 id 开始奇怪地增加。
列的 postgres 定义(从 Django 模型生成):
id | integer | not null default nextval('billing_invoice_id_seq'::regclass)
tpg=> SELECT MAX(id) FROM billing_invoice;
max
-------
16260
Run Code Online (Sandbox Code Playgroud)
然后我通过 django admin 创建了一个新记录:
tpg=> SELECT MAX(id) FROM billing_invoice;
max
-------
17223
tpg=> SELECT nextval('billing_invoice_id_seq');
nextval
---------
17224
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个新记录,它跳过了 17224 值并插入了 17225 的主键:
tpg=> SELECT nextval('billing_invoice_id_seq');
nextval
---------
17226
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样?应用程序此时并不关心,因为 id 仍在增加,但在最后几个新对象中,PK 在一次插入中从 427 -> 4357 跳过,然后在 2 个对象中跳到 8378,然后在 3 个对象中跳到 97xx它跳到了 14k。
因此,我有Client一个具有此方法的结构,该方法UserByID向端点发出HTTP请求User。我想对该功能进行单元测试,但也不想在该功能中发出实际的HTTP请求c.Request。我想通过响应和错误控制该功能。
func (c Client) UserByID(id string) (u User, err error) {
v := url.Values{}
v.Set("id", id)
opts := Request{
HTTP: http.Request{
Method: http.MethodGet,
Form: v,
},
URL: 'some/endpoint/users',
}
resp, err := c.Request(opts)
err = json.Unmarshal(resp, &u)
return
}
Run Code Online (Sandbox Code Playgroud)
这是存根的样子:
type mockClient struct {
Client
fakeUser User
fakeError error
}
func (mc mockClient) Request(opts Request) (resp []byte, err error) {
resp, err = json.Marshal(mc.fakeUser)
err = mc.fakeError
return
}
Run Code Online (Sandbox Code Playgroud)
在一个测试中,我有类似以下内容:
client := …Run Code Online (Sandbox Code Playgroud) 可能重复:
在数据库列中存储分隔列表真的那么糟糕吗?
我一直致力于几个PHP/MySQL项目,其中所有关系都以逗号分隔的字符串存储.
例如,一种常见的关系就像
(在伪代码中)
table people
id - integer
name - string
age - integer
teams - string (CSV OF integers, ex '1,3,9,21')
table teams
name - String
id - integer
Run Code Online (Sandbox Code Playgroud)
管理关系变得很麻烦.
让一个人获得所有团队:
$person = 'SELECT * FROM People WHERE id= x';
然后在PHP我一直在做类似的事情
$person['teams'] = SELECT * FROM teams WHERE id IN ($person['teams']);
Run Code Online (Sandbox Code Playgroud)
当我写这篇文章时,我意识到我可能会将它们组合在一个mysql查询中,例如:
select people.id, people.name, people.teams, teams.name from people JOIN teams ON FIND_IN_SET(teams.id, people.teams) where people.id=x
Run Code Online (Sandbox Code Playgroud)
通过这种类型的设置,我发现自己FIND_IN_SET经常使用
最后,我的问题是:创建这样的关系是否有性能优势?
根据我迄今为止的经验,FIND_IN_SET通常都在进行全表扫描.如果没有性能优势,在哪些情况下使用逗号分隔的整数列表是否有益? 在创建FIND_IN_SET时,似乎mysql设计者已经想到了一些东西.