7

我有一个表 foo 包含以下列

create table foo (
id integer not null auto_increment unique,
name varchar(255),
desc varchar(255),
modified_time datetime not null,
type tinyint(1)
)

在遵循所有列的排序约定方面是否有任何最佳实践(例如,以字母顺序或顶部不为空,底部的其余列不为空)

4

6 回答 6

3

肯定是主键第一
该列的名称通常是tablename _id (传统)或只是 'id' (例如 rails 等框架首选)。

如果使用,通常接下来是名称/描述字段,正如您所拥有的那样。

我倾向于在那之后放置外键(首先是父母,然后是孩子),因为它们在开发过程中往往更加关键。

然后我将其他数据分组,例如地址行、城市、州、邮编。

当没有其他规则适合时,我倾向于选择更高的必填字段以提高可见性。

时间戳(部分/全部 created_on、updated_on、removed_on 等)通常持续

所以在你的例子中,我实际上会这样做:

create table foo (
id integer not null auto_increment unique,
name varchar(255),
type tinyint(1),
desc varchar(255),
modified_time datetime not null
)

注意 - 正如 Kolink 所指出的,在 desc 上使用 description 因为 desc 是一个保留字,意思是降序,例如order desc

但是...大免责声明...

如果您的表格随时间变化(即现实世界)并且您有现有的生产数据,您将不会按照最初的“计划”排序字段。这可以通过导出和重新导入来避免,但在许多情况下,最好接受排序只是为了程序员方便而进行初始创建的约定,仅此而已。

这里的另一个热门话题是列名命名约定。这完全是另一个话题,但我会说除非被迫,否则不要缩写!

于 2011-10-29T12:39:11.077 回答
2

不仅没有真正的约定,而且最好不要去想一个。例如,有时插入查询在假定您要更新每个字段时不会指定字段名称。但是您必须按假定的顺序指定值。这是容易出错的。因此,考虑它的最佳方式是,“这些列存在于此表中,没有特定的顺序。”

于 2011-10-29T12:40:45.567 回答
0

不,真的。它很灵活,因此您可以根据需要对列进行排序。

我想主要的约定是确保您将您primary_key作为表中的第一列。

于 2011-10-29T12:36:28.690 回答
0

我个人从未听说过或见过这样的约定。用于数据库列的唯一约定通常是命名约定(通常从一个组织到另一个组织不同)和数据类型映射。

然而,约定只是它们的本质。因此,如果您觉得按字母顺序对列进行排序是正确的,请这样做。

于 2011-10-29T12:38:19.580 回答
0

我想说,这并不重要,是品味问题。

您希望确保在索引中使用与在频繁查询中使用的相同的列顺序,但仅此而已。

于 2011-10-29T12:38:48.937 回答
0

据我所知,没有。如果有任何相关的、唯一的描述性名称字段,我个人更喜欢将我认为每个表都应该有的主键(通常是代理键)放在前面,然后是名称/描述(用户的用户名,产品的产品名)。然后是逻辑父级的外键(订单行的 orderid)(如果有的话)。之后,我以最适合我的方式对它们进行排序,通常将相关字段分组(lastEditDate 和 lastEditedBy 彼此相邻)。我看不出按字母顺序排列列的充分理由。

于 2011-10-29T12:39:32.317 回答