我们在数据库中遇到了以下情况.我们有表'A'和表'B',它们具有M2M关系.关联表名为'AB',包含表'A'的FK列和表'B'的FK列.现在我们已经确定需要存储有关此关联的其他数据.例如,关联发生的日期,以及谁建立关联等.我们决定将这些附加列放在"AB"关联表中.然而,有些东西告诉我这是数据库纯粹主义者所不满意的.另一方面,我们创建一个额外的表来存储这些相关数据是没有意义的.
对此有何看法?
我在大约8个开发人员的团队中,在大约1'000'000行源代码的基础上开发代码库.我们的代码基本上是一个使用Oracle数据库的应用程序,但代码随着时间的推移而发展(我们有很多来自九十年代中期的源代码!).
团队之间就我们用于查询Oracle数据库的语法发生争执.目前,绝大多数查询使用"旧"Oracle语法进行连接,这意味着我们的代码看起来像这样......
内连接示例
select customers.*
, orders.date
, orders.value
from customers, orders
where customers.custid = orders.custid
Run Code Online (Sandbox Code Playgroud)
外连接示例
select customers.custid
, contacts.ContactName
, contacts.ContactTelNo
from customers, contacts
where customers.custid = contacts.custid(+)
Run Code Online (Sandbox Code Playgroud)
随着新开发人员加入团队,我们注意到他们中的一些人似乎更喜欢使用SQL-92查询,如下所示:
内连接示例
select customers.*
, orders.date
, orders.value
from customers inner join orders
on (customers.custid = orders.custid)
Run Code Online (Sandbox Code Playgroud)
外连接示例
select customers.custid
, contacts.ContactName
, contacts.ContactTelNo
from customers left join contacts
on (customers.custid = contacts.custid)
Run Code Online (Sandbox Code Playgroud)
A组说每个人都应该使用"旧"语法 - 我们有很多这种格式的代码,我们应该重视一致性.我们没有时间通过现在重写数据库查询的代码,如果我们有,它将不会付给我们.他们还指出"这是我们一直这样做的方式,我们对它感到满意......"
然而B组表示他们同意我们没有时间返回并更改现有查询,我们真的应该采用我们在此处编写的代码上的"新"语法.他们说开发人员只是真的一次查看一个查询,只要开发人员知道这两种语法,就没有什么可以从严格遵守旧语法中获得的,这可能会在将来的某个时候被弃用.
在没有宣布我忠诚于哪个群体的情况下,我有兴趣听取公正观察员的意见 - 所以让游戏开始吧!
马丁.
PS.我已经把它变成了一个社区wiki,以免被人看作只是公然追问问题点...
我正在使用RDBMS构建一个穷人的数据仓库.我已经确定了要记录的关键"属性":
我的要求是能够运行'OLAP'查询,允许我:
在阅读了这个主题领域之后,普遍的共识似乎是最好使用维度表而不是规范化表来实现.
假设这个断言是正确的(即最好使用事实和维度表来实现解决方案),我想在这些表的设计中寻求一些帮助.
'自然'(或明显)维度是:
哪个具有分层属性.但是,我正在努力如何建模以下字段:
我正在努力解决这些领域的原因是:
也许我上面使用的启发式太粗糙了?
我将举例说明我希望在数据仓库中进行的分析类型 - 希望这将进一步澄清事情.
我想按性别和人口统计分类汇总和分析数据 - 例如回答以下问题:
等等
任何人都可以澄清性别和人口统计分类是否属于事实表,或者它们是否(我怀疑)是维度表.
还假设它们是维度表,有人可以详细说明表结构(即字段)吗?
'明显'架构:
CREATE TABLE sex_type (is_male int);
CREATE TABLE demographic_category (id int, name varchar(4));
Run Code Online (Sandbox Code Playgroud)
可能不是正确的.
朋友们,
我通过另一个SO问题找到的Ask Tom 线程提到了Table和Transactional API,我试图理解它们之间的区别.
表API(TAPI)是无法访问基础表的地方,并且有"getters"和"setter"来获取信息.
例如,要选择一个地址,我会:
the_address := get_address(address_id);
Run Code Online (Sandbox Code Playgroud)
代替:
select the_address
from some_table
where identifier = address_id
Run Code Online (Sandbox Code Playgroud)
然后要更改地址,我将调用另一个负责更改的TAPI:
...
change_address(address_id, new_address);
...
Run Code Online (Sandbox Code Playgroud)
事务API(XAPI)再次没有直接访问权限来修改表中的信息,但我可以从中进行选择?(这是我的理解有点朦胧的地方)
要选择一个地址我会:
select the_address
from some_table
where identifier = address_id
Run Code Online (Sandbox Code Playgroud)
然后改变它我会打电话
...
change_address(address_id, new_address);
...
Run Code Online (Sandbox Code Playgroud)
因此,我可以在TAPI和XAPI之间看到的唯一区别是从数据库中检索记录的方法,即Select与PL/SQL调用?
是吗?还是我完全错过了这一点?
由于我正处于软件开发的初级职业生涯(C++和C#),我现在看到了我的缺陷以及我在这个领域所缺少的内容.正因为如此,我得出了一些结论,并使自己成为填补这些空白并增加我在软件开发方面的知识的计划.但是,在完成我需要完成的任务后,我偶然发现的问题对我来说并不是很明显.这些任务的优先级是什么?以下是这些任务以及编号的优先级:
学习:
你同意这个任务和优先事项吗?或者我在这里想念一些东西?欢迎任何建议!
下面是我运行的查询,以获取最近一小时的更新.
select count(*)
from my_table
where last_updated_date between to_date(to_char(sysdate,'YYYY-MM-DD HH24'))-1/24 and to_date(to_char(sysdate,'YYYY-MM-DD HH24'));
Run Code Online (Sandbox Code Playgroud)
我们的数据库是oracle,它失败了
ORA-01861: literal does not match format string
01861. 00000 - "literal does not match format string"
*Cause: Literals in the input must be the same length as literals in
the format string (with the exception of leading whitespace). If the
"FX" modifier has been toggled on, the literal must match exactly,
with no extra whitespace.
*Action: Correct the format string to match the literal.
Run Code Online (Sandbox Code Playgroud)
这次失败的原因是什么?
我在公司里多次设计过数据库.为了提高数据库的性能,我只查找规范化和索引.
如果要求您提高数据库的性能,该数据库包含大约250个表和一些包含数百万条记录的表,那么您需要查找哪些不同的内容?
提前致谢.
在csv值中传递时,如何创建以表格格式返回结果的包.
select * from table(schema.mypackage.myfunction('one, two, three'))
Run Code Online (Sandbox Code Playgroud)
应该回来
one
two
three
Run Code Online (Sandbox Code Playgroud)
我试过问汤姆但是只适用于sql类型.
我正在使用oracle 11g.内置有什么东西吗?
我正在为数据库类编写一个赋值,我们需要将现有的关系模式迁移到Oracle对象.这整个崩溃让我感到疑惑,这些东西有多广泛使用?数据模型很糟糕,语法很糟糕,而且面向对象只占实现方式的四分之三左右.
有人真的使用这个吗?
我试图type使用以下代码定义一个.
CREATE OR REPLACE TYPE MY_TYPE AS OBJECT (
app_id some_table_name.app_id%type
);
Run Code Online (Sandbox Code Playgroud)
如果我运行这个,我得到错误.
Error(4,32): PLS-00201: identifier 'some_table_name.app_id' must be declared
Run Code Online (Sandbox Code Playgroud)
这有什么问题?